LINQでのリストのフラット化


314

返すLINQクエリがありますIEnumerable<List<int>>が、返したいだけなList<int>ので、自分のすべてのレコードをIEnumerable<List<int>>1つの配列だけにマージします。

例:

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

すべての結果IEnumerable<List<int>>を1つだけにしたいList<int>

したがって、ソース配列から:[1,2,3,4]および[5,6,7]

アレイが1つだけ欲しい[1,2,3,4,5,6,7]

ありがとう

回答:


568

試す SelectMany()

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

8
ありがとう、これはいつも忘れます-あることは知っていますが、使用するたびにグーグルで過ごす時間が多すぎます。この回答をブックマークします。:-)
BrainSlugs83

しばらくの間、私がこれを必要とするのは自分だけだったのではないかと恐れていました。マイクありがとう!
Arnab Chakraborty、2015

7
の代替構文はありますSelectMany( i => i )か?私はこの構文がよく使われるのを見てきましたが、select機能の縮退した使い方のようですので、言語デザイナーはリストのリストに特化したショートカット構文を思いつくと思います
Andy

86

クエリ構文:

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

私が探していた正確な構文に感謝します、そして多くのSOの回答は他にもっと冗長なものを挙げています。
SilverSideDown

これは、SelectManyよりはるかに優れています。これを指摘してくれてありがとう、IMOで何が起こっているかをより明確に!
ブライアンレイナー2016

3
個人的に、私は常にクエリ構文のバージョンがメソッド呼び出しバージョンよりも直感的ではないと感じています。ResharperがループをLINQ式に変換することを提案している場合、クエリ構文が得られると、常に元に戻すために行きます。
bikeman868 2016

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にも「1つのアレイのみ」と記載されています
StefanJanssen

12

このような?

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

11

あなたが持っているなら、あなたはするList<List<int>> kことができます

List<int> flatList= k.SelectMany( v => v).ToList();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.