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

Jawaban:


568

Mencoba SelectMany()

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

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;

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

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

11

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

List<int> flatList= k.SelectMany( v => v).ToList();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.