2009-10-19 26 views
215

IEnumerable<List<int>>'u döndüren bir LINQ sorgum var ama sadece List<int> dönmek istiyorum, böylece tüm kaydımı IEnumerable<List<int>> numaralı tek birimde birleştirmek istiyorum.LINQ'deki Düzleştirme Listesi

Örnek:

Ben kaynak dizilerden, Dolayısıyla tek List<int>

için bütün sonuçları IEnumerable<List<int>> almak istiyorum

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

: [1,2,3,4] ve [5,6 , 7]

istediğim tek bir dizi [1,2,3,4,5,6,7]

sayesinde

cevap

386

Bunun gibi SelectMany()

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

teşekkür, hep bu bir unutmak - Ben, orada olduğunu biliyorum ama Her zaman kullanmam gerektiğinde bunun için çok fazla zaman harcadım. Bu cevabı işaretleme. :-) – BrainSlugs83

+0

Bir süreliğine buna ihtiyacım olan tek kişi olduğumdan korktum. Teşekkürler Mike! –

+1

SelectMany (i => i) 'için başka bir sözdizimi var mı? Ben bu sözdizimini çok kullandım ama seçkin özelliklerin dejenere bir kullanımı gibi görünüyor, bu yüzden dil tasarımcılarının özellikle listelerin listeleri için bir kısayol sözdizimi gelmesini beklerdim – Andy

7

deneyin?

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

Evet cevabınız için teşekkürler –

6

Eğer bir List<List<int>> k varsa

List<int> flatList= k.SelectMany(v => v).ToList(); 
sorgusu sözdizimi ile
19
iList.SelectMany(x => x).ToArray() 
+6

@recursive Diğer herkes ne kaçırdı? '.ToArray() '? - Bu tür bir durumdur - eğer sadece bir kez yinelemeniz gerekiyorsa - ya da öğeler değişiyorsa, o zaman .ToArray() 'kesinlikle istediğiniz gibi değildir. Ancak, birden çok kez numaralandıracağınız statik öğelerle, '.ToList()' veya '.ToArray(), performans artışı sağlar (biraz daha yüksek bellek kullanımı pahasına, ki bu genellikle oldukça iyi bir anlaşmadır)). – BrainSlugs83

+2

Muhtemelen bu durumda koşulların diziler gerektirmesi gerekir, çünkü bu soruda belirtilmiştir. – recursive

+7

@recursive, nitpicking iseniz OP, "List " 'i geri göndermesi gerektiğini söylüyor, bu yüzden '.ToList()' daha sonra doğru seçim olacaktır. – MEMark

70

yapabilirsiniz:

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

+1 Alternatif sözdizimi için –

+0

Teşekkürler Tam sözdizimi aradım ve çok fazla SO yanıtı başka bir şey daha fazla verbose. – SilverSideDown

+0

Bu, SelectMany'den çok daha iyi. IMO'da neler olduğunu daha net olarak açıklayın, bunu işaretlediğiniz için teşekkürler! –