合并多个列表

Amy*_*Amy 4 .net c# linq list

鉴于我有一个列表列表,其中所有列表包含0个或更多项,可能但不一定都是相同的数字.我希望有一个包含列表中所有项目的列表...但是我希望订单如下:首先是所有列表中的第一个项目,以便它们出现在"超级列表"中.List<List<T>>

防爆.

List[0] = { 'Apple', 'Blueberry', 'Cranberry' }
List[1] = { 'Anteater', 'Baboon', 'Camel', 'Dodo'}
List[2] = { 'Albatross', 'Blackbird', 'Chicken'}

result = { 'Apple', 'Anteater', 'Albatross', 'Blueberry', 'Baboon', 
           'Blackbird', 'Cranberry', 'Camel', 'Chicken', 'Dodo' }
Run Code Online (Sandbox Code Playgroud)

(请注意,这不是字母顺序,蓝莓来自狒狒之前)

当然,只要有一个非空的列表,我就可以通过计数器循环遍历'superlist',逐个将项添加到结果列表中:

int i = 0;
bool done = false;

while (!done)
{
    bool found = false;

    foreach (list l in superlist)
    {
        if (l.Count() > i)
        {
           found = true;
           result.Add(l[i]);
        }
    }

    i++;

    if (!found)
        done = true;
}
Run Code Online (Sandbox Code Playgroud)

但是使用一些优化的LINQ函数来做这件事会更好.我一直在研究Zip,GroupByAggregate,但无法让它们发挥作用.

那么:是否有一个漂亮的LINQ函数,或多个的组合,将其变成漂亮的代码,或者我应该坚持(并可能优化)我当前的函数?

编辑:一个简单的SelectMany(x => x)也没有这个技巧,因为它保留了列表的顺序,而不是像我的算法那样折叠它们.有关详细信息,请参阅我的初始问题

I4V*_*I4V 8

你需要 SelectMany

var result = lists.SelectMany(x => x.Select((s, inx) => new { s, inx }))
                .GroupBy(x => x.inx)
                .SelectMany(x => x.Select(y => y.s))
                .ToList();
Run Code Online (Sandbox Code Playgroud)

编辑

对于那些想要尝试的人,初始化代码.

List<List<string>> lists = new List<List<string>>()
        {
            new List<string>(){ "Apple", "Blueberry", "Cranberry" },
            new List<string>(){ "Anteater", "Baboon", "Camel", "Dodo"},
            new List<string>(){ "Albatross", "Blackbird", "Chicken"},
        };
Run Code Online (Sandbox Code Playgroud)

编辑2

OUTPUT: Apple,Anteater,Albatross,Blueberry,Baboon,Blackbird,Cranberry,Camel,Chicken,Dodo