Liste Linq de listes en liste unique


201

On dirait que c'est le genre de chose à laquelle on aurait déjà répondu, mais je ne peux pas le trouver.

Ma question est assez simple, comment puis-je faire cela dans une seule instruction afin qu'au lieu d'avoir à refaire la liste vide puis à l'agréger sur la ligne suivante, je puisse avoir une seule instruction linq qui génère ma liste finale. les détails sont une liste d'éléments qui contiennent chacun une liste de résidences, je veux juste toutes les résidences dans une liste plate.

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

Réponses:


316

Vous souhaitez utiliser la SelectManyméthode d'extension.

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

3
Merci. @JaredPar a sélectionné le mauvais élément, mais merci à vous deux pour vos conseils.
Jarrett Widman

51

Utilisez SelectMany

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

35

Voici un exemple de code pour vous:

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

Et le résultat sera:

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

29

Et pour ceux qui veulent la syntaxe d'expression de requête: vous utilisez deux instructions from

var residences = (from d in details from a in d.AppForm_Residences select a).ToList();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.