如何展平数组数组?

use*_*330 6 c# linq arrays

我有一个由以下元素组成的数组:

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,不幸的是,出现了。

Oli*_*ver 5

第一步,您必须将数据规范化为一种类型。然后你可以随意迭代它们。所以首先创建一个方法来将值从特定点展平到任意深度:

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)