Aynı tür öğelere sahip listelerin listesini tek bir öğeyle nasıl birleştirebilirim?


210

Soru kafa karıştırıcı, ancak aşağıdaki kodlarda açıklandığı gibi çok daha açık:

   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 veya Lambda kullanarak mümkün olup olmadığından emin değil misiniz?

Esasen, bir liste listesini nasıl birleştirebilir veya " düzleştirebilirim "?

Yanıtlar:


456

SelectMany uzantı yöntemini kullanın

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

73
Acaba kaç kişi kendi "Flatten" uzantısını seçti SelectMany nasıl çalıştığını anlamadı?
James Schek

1
Bunun çalışması için neden x => x gereklidir? Genellikle x => x +1 gibi şeyler görürüm, ancak x => x değil.
SwimBikeRun

9
@SwimBikeRun SelectMany, IEnumerable TSources almak, listedeki her TSource'u IEnumerable TResults'a dönüştürmek, sonra tüm bu IEnumerable'ları büyük bir tane olarak birleştirmek için kullanılır. Bu durumda, başlayacak bir liste listeniz vardır, bu nedenle bunları bir TSource'dan (bir IEnumerable of Tresults) bir IEnumerable of TResults ile eşleme işlevini birleştirmek istiyorsanız kimlik işlevidir (x => x). Bu gerçekten sadece özel bir durumdur, burada her TSource'u bir listeye dönüştürmek için fazladan bir adım gerekmez, çünkü zaten bir liste.
Sean

@JaredPar bu mantığı <list <list <T> >> listesine uygulayabilir miyiz?
Tk1993

4
Tabii ki, sadece kullanınlist.SelectMany(x => x.SelectMany(y => y)).ToList();
Brandon Kramer

13

İşte C # tümleşik sözdizimi sürümü:

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

Biraz kafa karıştırıcı, ama güzel. Bu nasıl? var items = içindeki öğeden (listeden listeden Listeyi seç listeyi seçin) öğeyi seç
David.Chu.ca

4
'Double from', SelectMany ile aynıdır ... SelectMany, muhtemelen LINQ yöntemlerinin (veya sorgu operatörlerinin) en güçlüsüdür. Nedenini görmek için Google "LINQ SelectMany Monad" ve bunun hakkında bilmek istediğinizden daha fazlasını keşfedeceksiniz.
Richard Anthony Hein

3
"LINQ SelectMany Monad" kelimesini kullanırken tırnak eklemeyin, aksi takdirde sizi buraya geri yönlendirir.
Oxin

12

Bunu mu diyorsun?

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);

Sonuçlar: 9 9 9 1 2 3 4 5 6


Veya birleştirilen öğeleri mevcut listeye eklemek için Concat () yerine list.AddRange () öğesini kullanabilirsiniz.
dahlbyk

1

İçin List<List<List<x>>>ve benzeri

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

Bu bir yorumda yayınlanmıştır, ancak bence ayrı bir yanıtı hak ediyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.