同じタイプのアイテムを含むリストのリストを単一のアイテムリストにマージする方法


209

質問は紛らわしいですが、次のコードで説明されているように、はるかに明確です。

   List<List<T>> listOfList;
   // add three lists of List<T> to listOfList, for example
   /* listOfList = new {
        { 1, 2, 3}, // list 1 of 1, 3, and 3
        { 4, 5, 6}, // list 2
        { 7, 8, 9}  // list 3
        };
   */
   List<T> list = null;
   // how to merger all the items in listOfList to list?
   // { 1, 2, 3, 4, 5, 6, 7, 8, 9 } // one list
   // list = ???

C#LINQまたはLambdaを使用してそれが可能かどうかわからない?

基本的に、リストのリストを連結または「フラット化」するにはどうすればよいですか?

回答:


455

SelectMany拡張メソッドを使用する

list = listOfList.SelectMany(x => x).ToList();

73
SelectManyがどのように機能するかを理解していない独自の "Flatten"拡張機能を何人が書いたのでしょうか。
James Schek、2009

1
これが機能するためにx => xが必要なのはなぜですか?私は通常x => x +1のようなものを見ますが、x => xではありません。
SwimBikeRun 2015

9
@SwimBikeRun SelectManyを使用して、TSourceのIEnumerableを取得し、リスト内の各TSourceをTResultsのIEnumerableに変換してから、それらのIEnumerableをすべて1つの大きなものに連結します。この場合、開始するリストのリストがあるため、それらを連結する場合、TSource(IEnumerableのTResults)からIEResulterableのTResultsにマップする関数は、識別関数(x => x)です。これは実際には、各TSourceをリストに変換する追加の手順が不要な特別なケースに過ぎません。これは、既にTSourceがリストになっているためです。
Sean

@JaredParこのロジックをlist <list <list <T >>>に適用できますか?
Tk1993

4
@TusharKukreti確かに使用してくださいlist.SelectMany(x => x.SelectMany(y => y)).ToList();
ブランドンクレイマー

13

これは、C#統合構文バージョンです。

var items =
    from list in listOfList
    from item in list
    select item;

少し混乱しますが、いいです。これはどう?var items = from item in(from from list in listOflist select list)select item
David.Chu.ca

4
'double from'はSelectManyと同じです... SelectManyはおそらく最も強力なLINQメソッド(またはクエリ演算子)です。理由を確認するには、Googleの「LINQ SelectMany Monad」を使用すると、知りたいこと以上のことがわかります。
Richard Anthony Hein、

3
"LINQ SelectMany Monad"をグーグル検索するときに引用符を含めないでください。引用符を含めると、ここに戻ります。
Oxin

12

これはどういう意味ですか?

var listOfList = new List<List<int>>() {
    new List<int>() { 1, 2 },
    new List<int>() { 3, 4 },
    new List<int>() { 5, 6 }
};
var list = new List<int> { 9, 9, 9 };
var result = list.Concat(listOfList.SelectMany(x => x));

foreach (var x in result) Console.WriteLine(x);

結果: 9 9 9 1 2 3 4 5 6


または、Concat()の代わりにlist.AddRange()を使用して、マージされたアイテムを既存のリストに追加することもできます。
dahlbyk 2009

1

などの場合List<List<List<x>>>

list.SelectMany(x => x.SelectMany(y => y)).ToList();

これはコメントで投稿されましたが、私の意見では別の返答に値します。

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