2009-10-19 66 views
215

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

实施例:

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 1,7]

我想仅一个阵列 [1,2,3,4,5,6,7]

由于

回答

386

尝试SelectMany()

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

谢谢,我总是忘了这一个 - 我知道它的存在,但我只是花太多时间在每次需要使用Google时都会搜索它。书签这个答案。 :-) – BrainSlugs83 2013-12-19 18:51:40

+0

有一段时间我害怕我是唯一一个需要这个的人。谢谢迈克! – 2015-04-14 08:52:58

+1

“SelectMany(i => i)'有一些替代语法吗?我已经看到这个语法用了很多,但它似乎是选择功能的退化使用,所以我希望语言设计师能够为列表清单提供一个快捷语法 – Andy 2017-02-09 12:15:34

7

喜欢这个?

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

是的,谢谢你回答 – 2009-10-19 19:53:16

6

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

List<int> flatList= k.SelectMany(v => v).ToList(); 
19
iList.SelectMany(x => x).ToArray() 
+6

@recursive其他人都错过了什么? '.ToArray()'? - 这种情况有点 - 如果你只需要迭代一次 - 或者如果项目可能改变,那么'.ToArray()'绝对不是你想要的。但是对于要多次枚举的静态项,'.ToList()'或'.ToArray()'会提高性能(代价是内存使用率稍高一些,这通常是一个相当不错的交易)。 – BrainSlugs83 2013-12-19 18:55:43

+2

大概在这种情况下需要数组,因为这是在问题中指定的。 – recursive 2013-12-19 21:49:35

+7

@递归的,如果我们挑剔,OP说他需要返回'List ',所以'.ToList()'是正确的选择。 – MEMark 2014-02-26 16:48:55

70

通过查询语法:

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

+1替代语法 – 2009-10-19 19:57:52

+0

感谢我一直在寻找的确切语法,所以很多SO答案列出了其他更详细的内容。 – SilverSideDown 2014-02-04 21:19:41

+0

这比SelectMany要好得多。更清楚IMO到底发生了什么,感谢您指出这一点! – 2016-09-14 15:49:42