c# – 如何从列表中创建新列表,其中元素在新列表中的顺序是另一种顺序?

参见英文答案 > Interleaving multiple (more than 2) irregular lists using LINQ                                    5个
假设我有列表清单.我想从给定的列表列表中创建新列表,以便元素按照下面给出的示例顺序.

输入: –

List<List<int>> l = new List<List<int>>();

List<int> a = new List<int>();
a.Add(1);
a.Add(2);
a.Add(3);
a.Add(4);
List<int> b = new List<int>();
b.Add(11);
b.Add(12);
b.Add(13);
b.Add(14);
b.Add(15);
b.Add(16);
b.Add(17);
b.Add(18);

l.Add(a);
l.Add(b);

输出(列表): –

1
11
2
12
3
13
4
14
15
16 

输出列表不得包含10个以上的元素.

我目前正在使用foreach进行此操作,但我想知道如何使用LINQ执行此操作.

int loopCounter = 0,index=0;
List<int> o=new List<int>();
while(o.Count<10)
{
    foreach(List<int> x in l)
    {
        if(o.Count<10)
           o.Add(x[index]);
    }
    index++;
}

谢谢.

最佳答案
使用接收项目索引的SelectMany和Select重载.这将用于应用所需的顺序. SelectMany的使用是为了展平嵌套集合级别.最后,应用Take仅检索所需数量的项目:

var result = l.SelectMany((nested, index) => 
                  nested.Select((item, nestedIndex) => (index, nestedIndex, item)))
              .OrderBy(i => i.nestedIndex)
              .ThenBy(i => i.index)
              .Select(i => i.item)
              .Take(10);

或者在查询语法中:

var result = (from c in l.Select((nestedCollection, index) => (nestedCollection, index))
              from i in c.nestedCollection.Select((item, index) => (item, index))
              orderby i.index, c.index
              select i.item).Take(10);

如果使用C#6.0和之前的项目,则使用匿名类型:

var result = l.SelectMany((nested, index) => 
                  nested.Select((item, nestedIndex) => new {index, nestedIndex, item}))
              .OrderBy(i => i.nestedIndex)
              .ThenBy(i => i.index)
              .Select(i => i.item)
              .Take(10);

解释为什么Zip单独是不够的:zip相当于在第二个集合上执行连接操作到第一个,其中
要加入的属性是索引.因此,只有第一个集合中存在的项目(如果它们在第二个集合中匹配)将显示在结果中.

下一个选项是考虑左连接,它将返回第一个集合的所有项目,并在第二个集合中匹配(如果存在).在描述的情况下,OP正在寻找完整外连接的功能 – 尽可能获取收集和匹配的所有项目.

转载注明原文:c# – 如何从列表中创建新列表,其中元素在新列表中的顺序是另一种顺序? - 代码日志