Elenco Linq di elenchi a singolo elenco


201

Sembra che questo sia il tipo di cosa a cui sarebbe già stata data risposta ma non riesco a trovarlo.

La mia domanda è piuttosto semplice, come posso farlo in un'istruzione in modo che invece di dover nuovo l'elenco vuoto e quindi aggregare nella riga successiva, posso avere una singola istruzione linq che restituisca il mio elenco finale. dettagli è un elenco di elementi che contengono ciascuno un elenco di residenze, voglio solo tutte le residenze in un elenco piatto.

var residences = new List<DAL.AppForm_Residences>();
details.Select(d => d.AppForm_Residences).ToList().ForEach(d => residences.AddRange(d));

Risposte:


316

Vuoi usare il SelectManymetodo di estensione.

var residences = details.SelectMany(d => d.AppForm_Residences).ToList();

3
Grazie. @JaredPar ha la selezione dall'elemento sbagliato, ma grazie ad entrambi per la guida.
Jarrett Widman,

51

Usa SelectMany

var all = residences.SelectMany(x => x.AppForm_Residences);

35

Ecco un codice di esempio per te:

List<int> listA = new List<int> { 1, 2, 3, 4, 5, 6 };

List<int> listB = new List<int> { 11, 12, 13, 14, 15, 16 };

List<List<int>> listOfLists = new List<List<int>> { listA, listB };

List<int> flattenedList = listOfLists.SelectMany(d => d).ToList();

foreach (int item in flattenedList)
{
    Console.WriteLine(item);
}

E il risultato sarà:

1
2
3
4
5
6
11
12
13
14
15
16
Press any key to continue . . .

29

E per coloro che desiderano la sintassi dell'espressione di query: ne usi due dalle istruzioni

var residences = (from d in details from a in d.AppForm_Residences select a).ToList();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.