Aplatir la liste dans LINQ


314

J'ai une requête LINQ qui retourne IEnumerable<List<int>>mais je veux retourner seulement List<int>donc je veux fusionner tous mes enregistrements dans IEnumerable<List<int>>un seul tableau.

Exemple :

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

Je veux porter tout mon résultat IEnumerable<List<int>>à un seulList<int>

Par conséquent, à partir des tableaux source: [1,2,3,4] et [5,6,7]

Je veux un seul tableau [1,2,3,4,5,6,7]

Merci

Réponses:


568

Essayer SelectMany()

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

8
Merci, j'oublie toujours celui-ci - je sais qu'il est là, mais je passe juste beaucoup trop de temps à googler pour cela chaque fois que je dois l'utiliser. Mettre cette réponse en signet. :-)
BrainSlugs83

Pendant un moment, j'ai eu peur d'être le seul à en avoir eu besoin. Merci Mike!
Arnab Chakraborty

7
Existe-t-il une syntaxe alternative pour SelectMany( i => i )? J'ai vu cette syntaxe beaucoup utilisée, mais cela semble une utilisation dégénérée de la fonction de sélection, donc je m'attendais à ce que les concepteurs de langage proposent une syntaxe de raccourci spécifiquement pour les listes de listes
Andy

86

Avec la syntaxe de requête:

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

Merci la syntaxe exacte que je cherchais, et tant de réponses SO listent autre chose de plus détaillé.
SilverSideDown

C'est beaucoup, beaucoup mieux que SelectMany. Plus clair exactement ce qui se passe à l'OMI, merci de l'avoir signalé!
Bryan Rayner du

3
Personnellement, je trouve toujours la version de la syntaxe de requête beaucoup moins intuitive que la méthode appelant la version. Lorsque Resharper propose de convertir des boucles en expressions LINQ si cela me donne la syntaxe de requête, je vais toujours pour annuler.
bikeman868

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

6
@recursive Qu'est-ce que tout le monde a manqué? .ToArray()? - C'est un peu circonstanciel - si vous ne devez répéter qu'une seule fois - ou si les éléments sont susceptibles de changer, ce .ToArray()n'est certainement pas ce que vous voulez. Mais avec des éléments statiques que vous allez énumérer plusieurs fois, .ToList()ou .ToArray()améliorerez les performances (au prix d'une utilisation de mémoire légèrement plus élevée, ce qui est généralement une bonne affaire).
BrainSlugs83

2
Vraisemblablement, les circonstances dans ce cas nécessitent des tableaux, puisque cela a été spécifié dans la question.
récursif

8
@recursive, si nous sommes tatillons, le PO dit qu'il doit revenir List<int>, ce .ToList()serait donc le bon choix.
MEMark

@MEMark OP indique également "à une seule baie"
StefanJanssen

12

Comme ça?

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

11

Si vous en avez un, List<List<int>> kvous pouvez le faire

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