2009-10-19 69 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