LINQ'daki Listeyi Düzleştir


313

Geri dönen bir LINQ sorgusu var IEnumerable<List<int>>ama ben sadece List<int>bu yüzden tüm kayıtları benim IEnumerable<List<int>>tek bir diziye birleştirmek istiyorum dönmek istiyorum .

Misal :

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

Tüm sonuçlarımı IEnumerable<List<int>>sadece bir tanesine almak istiyorumList<int>

Bu nedenle, kaynak dizilerden: [1,2,3,4] ve [5,6,7]

Sadece bir dizi istiyorum [1,2,3,4,5,6,7]

Teşekkürler

Yanıtlar:


567

Deneyin SelectMany()

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

8
Teşekkürler, bunu her zaman unuturum - orada olduğunu biliyorum, ama her zaman kullanmam için Google'a çok fazla zaman harcıyorum. Bu yanıta yer işareti koyma. :-)
BrainSlugs83

Bir süredir buna ihtiyaç duyan tek kişi olduğumdan korktum. Teşekkürler Mike!
Arnab Chakraborty

7
İçin başka bir sözdizimi var mı SelectMany( i => i )? Bu sözdiziminin çok kullanılmış olduğunu gördüm, ancak seçme özelliğinin dejenere kullanımı gibi görünüyor, bu yüzden dil tasarımcılarının özellikle liste listeleri için bir kısayol sözdizimi
Andy

86

Sorgu sözdizimi ile:

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

Aradığım tam sözdizimi sayesinde ve birçok SO yanıtı daha ayrıntılı bir şey listeliyor.
SilverSideDown

Bu SelectMany'den çok, çok daha iyi. IMO'da neler olup bittiğini daha net, buna dikkat çektiğiniz için teşekkürler!
Bryan Rayner

3
Şahsen ben her zaman sorgu sözdizimi sürümünü yöntem çağıran sürümü çok daha az sezgisel bulabilirsiniz. Resharper bana her zaman geri almak için gitmek sorgu sözdizimi verirse döngüler LINQ ifadelerine dönüştürmek teklif ettiğinde.
bikeman868

23
iList.SelectMany(x => x).ToArray()

6
@recursive Herkes neyi kaçırdı? .ToArray()? - Bu tür bir durumdur - sadece bir kez tekrarlamanız gerekiyorsa - veya öğelerin değişme olasılığı varsa .ToArray(), kesinlikle istediğiniz şey değildir. Ancak, birden fazla kez numaralandıracağınız .ToList()veya .ToArray()performans iyileştirmesi vereceğiniz statik öğelerle (biraz daha yüksek bellek kullanımı pahasına, bu genellikle oldukça iyi bir anlaşmadır).
BrainSlugs83

2
Muhtemelen bu durumda koşullar sorunda belirtildiği için diziler gerektirir.
özyinelemeli

8
@ recursive, nitpicking ise, OP geri dönmek gerektiğini söylüyor List<int>, bu yüzden .ToList()doğru seçim olacaktır.
MEMark

@ Markark OP de "sadece bir dizi" diyor
StefanJanssen

12

Bunun gibi?

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

11

Eğer bir tane List<List<int>> kvarsa yapabilirsin

List<int> flatList= k.SelectMany( v => v).ToList();
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.