Linq lista de listas para lista única

201

Parece que esse é o tipo de coisa que já teria sido respondida, mas não consigo encontrá-lo.

Minha pergunta é bem simples, como posso fazer isso em uma instrução para que, em vez de precisar renovar a lista vazia e depois agregar na próxima linha, possa ter uma única instrução linq que produz minha lista final. details é uma lista de itens que contêm uma lista de residências, quero apenas todas as residências em uma lista simples.

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

Respostas:

316

Você deseja usar o SelectManymétodo de extensão.

var residences = details.SelectMany(d => d.AppForm_Residences).ToList();
Noldorin
fonte
3
Obrigado. O @JaredPar selecionou o elemento errado, mas agradeço a ambos pela orientação.
Jarrett Widman
51

Use SelectMany

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

Aqui está um código de exemplo para você:

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 a saída será:

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

E para aqueles que desejam a sintaxe da expressão de consulta: você usa duas instruções from

var residences = (from d in details from a in d.AppForm_Residences select a).ToList();
Sean B
fonte