【发布时间】:2018-12-13 12:51:36
【问题描述】:
我有一个由以下元素组成的数组:
var schools = new [] {
new object[]{ new[]{ "1","2" }, "3","4" },
new object[]{ new[]{ "5","6" }, "7","8" },
new object[]{ new[]{ "9","10","11" }, "12","13" }
};
我试图展平的真正对象是将数据从 CSV 导入数组数组,然后将其加入字段值:
var q =
from c in list
join p in vocatives on c.Line[name1].ToUpper() equals p.first_name.ToUpper() into ps
from p in ps.DefaultIfEmpty()
select new object[] { c.Line, p == null ? "(No vocative)" : p.vocative, p == null ? "(No sex)" : p.sex };
我想展平该字符串数组以获得:
string[] {
new string[]{ "1","2","3","4" },
new string[]{ "5","6","7","8" },
new string[]{ "9","10","11","12","13" }
}
我已经有一个可以循环执行此操作的解决方案,它在性能方面并不那么明智,但它似乎可以正常工作。
我尝试使用SelectMany,但无法提出解决方案。
非常感谢您的反馈;) 我已经尝试过 npo 的回答:
var result = schools.Select(z => z.SelectMany(y=> y.GetType().IsArray
? (object[])y : new object[] { y })
);
但 CSVwriter 类方法只接受显式类型:
IEnumerable<string[]>
那么如何在 linq 中做到这一点,我尝试过:
List<string[]> listOflists = (List<string[]>)result;
但不行,很遗憾,InvalidCastException 出现了。
【问题讨论】:
-
听起来像是一道作业题。
-
因为您将字符串数组与字符串混合,所以我认为不会有一个简单的 linq 解决方案。我认为您需要进行更传统的循环检查每个项目是数组还是字符串,并根据该检查进行处理。
-
"我尝试过使用 SelectMany" 然后请显示您尝试过的内容。我怀疑如果有人在这里找到与您已经拥有的完全相同的解决方案并将其发布在此处,它会对您有所帮助。
-
一件事:我在您的示例中注意到始终存在一个字符串数组,并且它始终是对象数组中的第一项。这是一个规则还是只是您的测试数据中的巧合?
-
如果这种结构是由您的应用程序或数据“自然”生成的(即不是拼图或家庭作业),请考虑对其进行改造。虽然您可以编写代码来处理它(如答案所示),但部分困难在于,就 O-O 而言,这种结构的类型相当糟糕。例如,如果将单个字符串表示为单元素数组,则整个内容自然会适合
string[][][]。或者,封装这些字符串所代表的数据的适当类也会有所帮助(例如,string Value和string[] Children)。