LINQ中的展平列表


313

我有一个返回的LINQ查询,IEnumerable<List<int>>但我只想返回,List<int>所以我想将我的所有记录合并IEnumerable<List<int>>到一个数组中。

范例:

IEnumerable<List<int>> iList = from number in
    (from no in Method() select no) select number;

我想利用我所有的结果IEnumerable<List<int>>只有一个List<int>

因此,从源数组:[1,2,3,4]和[5,6,7]

我只想要一个数组[1,2,3,4,5,6,7]

谢谢

Answers:


567

尝试 SelectMany()

var result = iList.SelectMany( i => i );

8
谢谢,我总是忘记了这个-我知道它在那里,但是每次我需要使用它时,我都会花太多时间在Google上搜索。收藏这个答案。:-)
BrainSlugs83 2013年

有一阵子,我担心我是唯一需要这个的人。谢谢迈克!
Arnab Chakraborty 2015年

7
是否有一些替代语法SelectMany( i => i )?我已经看到这种语法使用了很多,但是似乎对select功能的使用已经退化,因此我希望语言设计人员能够专门针对列表列表使用快捷语法
Andy

86

使用查询语法:

var values =
from inner in outer
from value in inner
select value;

感谢我一直在寻找的确切语法,所以有这么多的答案列出了其他更详细的内容。
SilverSideDown 2014年

这比SelectMany好得多。更清楚地了解IMO的情况,感谢您指出这一点!
布莱恩·雷纳

3
我个人总是发现查询语法版本比方法调用版本更不直观。当Resharper提供将循环转换为LINQ表达式时,如果它为我提供了查询语法,我将始终撤消。
bikeman868

23
iList.SelectMany(x => x).ToArray()

6
@recursive其他所有人都错过了什么?.ToArray()?-这种情况只是偶然的-如果您只需要迭代一次-或者项目可能会更改,那么.ToArray()绝对不是您想要的。但是对于静态项目,您将要枚举多次,.ToList()或者.ToArray()将提高性能(以稍微提高内存使用量为代价,通常这是相当不错的选择)。
BrainSlugs83 2013年

2
大概在这种情况下,情况需要数组,因为问题中已指定了数组。
递归

8
@recursive,如果我们挑剔,则OP表示他需要返回List<int>,因此.ToList()将是正确的选择。
MEMark 2014年

@MEMark OP还声明“仅一个数组”
StefanJanssen

12

像这样?

var iList = Method().SelectMany(n => n);

11

如果你有一个List<List<int>> k可以做的

List<int> flatList= k.SelectMany( v => v).ToList();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.