Ratakan Daftar di LINQ

314

Saya punya permintaan LINQ yang mengembalikan IEnumerable<List<int>>tetapi saya ingin kembali hanya List<int>jadi saya ingin menggabungkan semua catatan saya di saya IEnumerable<List<int>>menjadi hanya satu array.

Contoh:

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

Saya ingin mengambil semua hasil saya IEnumerable<List<int>>hanya untuk satuList<int>

Oleh karena itu, dari array sumber: [1,2,3,4] dan [5,6,7]

Saya hanya ingin satu array [1,2,3,4,5,6,7]

Terima kasih

Cédric Boivin
sumber

Jawaban:

568

Mencoba SelectMany()

var result = iList.SelectMany( i => i );
Mike Two
sumber
8
Terima kasih, saya selalu lupa yang ini - saya tahu itu ada di sana, tapi saya hanya menghabiskan terlalu banyak waktu untuk mencari Google setiap kali saya perlu menggunakannya. Bookmark jawaban ini. :-)
BrainSlugs83
Untuk sesaat aku takut bahwa hanya aku yang membutuhkan ini. Terima kasih Mike!
Arnab Chakraborty
7
Apakah ada sintaks alternatif untuk SelectMany( i => i )? Saya telah melihat sintaks ini banyak digunakan tetapi tampaknya penggunaan fitur pilihnya menurun, jadi saya akan mengharapkan desainer bahasa untuk membuat sintaks shortcut khusus untuk daftar daftar
Andy
86

Dengan sintaks kueri:

var values =
from inner in outer
from value in inner
select value;
rekursif
sumber
Terima kasih sintaks persis yang saya cari, dan begitu banyak jawaban SO daftar sesuatu yang lebih verbose.
SilverSideDown
Ini jauh, jauh lebih baik daripada SelectMany. Lebih jelas apa yang terjadi pada IMO, terima kasih telah menunjukkan ini!
Bryan Rayner
3
Secara pribadi saya selalu menemukan versi sintaks kueri jauh lebih sedikit intuitif daripada versi metode panggilan. Ketika Resharper menawarkan untuk mengonversi loop ke ekspresi LINQ jika itu memberi saya sintaks kueri, saya selalu membatalkan.
bikeman868
23
iList.SelectMany(x => x).ToArray()
Dylan Beattie
sumber
6
@recursive Apa yang dilewatkan orang lain? .ToArray()? - Itu semacam keadaan - jika Anda hanya perlu mengulangi sekali - atau jika item cenderung berubah, maka .ToArray()jelas bukan yang Anda inginkan. Tetapi dengan item statis yang akan Anda hitung berulang kali, .ToList()atau .ToArray()akan memberikan peningkatan kinerja (dengan biaya penggunaan memori yang sedikit lebih tinggi, yang biasanya cukup bagus).
BrainSlugs83
2
Agaknya keadaan dalam kasus ini memerlukan array, karena itu ditentukan dalam pertanyaan.
Rekursif
8
@recursive, jika kita melakukan nitpicking, OP mengatakan bahwa dia perlu kembali List<int>, maka itu .ToList()akan menjadi pilihan yang tepat.
MEMark
@MEMark OP juga menyatakan "hanya satu array"
StefanJanssen
12

Seperti ini?

var iList = Method().SelectMany(n => n);
mqp
sumber
11

Jika Anda punya, List<List<int>> kAnda bisa melakukannya

List<int> flatList= k.SelectMany( v => v).ToList();
Daniel
sumber