我有一个由以下元素组成的数组:
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" }
};
Run Code Online (Sandbox Code Playgroud)
我尝试扁平化的真正对象是将数据从 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 };
Run Code Online (Sandbox Code Playgroud)
我想展平该字符串数组以获得:
string[] {
new string[]{ "1","2","3","4" },
new string[]{ "5","6","7","8" },
new string[]{ "9","10","11","12","13" }
}
Run Code Online (Sandbox Code Playgroud)
我已经有一个在循环中执行此操作的解决方案,它在性能方面不是那么好,但它似乎工作正常。
我尝试使用SelectMany
但无法解决。
非常感谢您的反馈 ;) 我已经尝试过来自 npo 的回答:
var result = schools.Select(z => z.SelectMany(y=> y.GetType().IsArray
? (object[])y : new object[] { y })
);
Run Code Online (Sandbox Code Playgroud)
但是 CSVwriter 类方法只接受显式输入:
IEnumerable<string[]>
Run Code Online (Sandbox Code Playgroud)
那么如何在 linq 中做到这一点,我试图:
List<string[]> listOflists = (List<string[]>)result;
Run Code Online (Sandbox Code Playgroud)
但是InvalidCastException
,不幸的是,出现了。
第一步,您必须将数据规范化为一种类型。然后你可以随意迭代它们。所以首先创建一个方法来将值从特定点展平到任意深度:
public static class Extensions
{
public static IEnumerable<object> FlattenArrays(this IEnumerable source)
{
foreach (var item in source)
{
if (item is IEnumerable inner
&& !(item is string))
{
foreach (var innerItem in inner.FlattenArrays())
{
yield return innerItem;
}
}
yield return item;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在您可以在顶层迭代以获取所有值的单个数组:
// Produces one array => ["1", "2", "3", "4", ...]
var allFlat = schools.FlattenArrays().OfType<string>().ToArray();
Run Code Online (Sandbox Code Playgroud)
或者您可以创建更深一层的单个数组:
foreach (var item in schools)
{
// Produces an array for each top level e.g. ["5", "6", "7", "8"]
var flat = item.FlattenArrays().OfType<string>().ToArray();
}
Run Code Online (Sandbox Code Playgroud)