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

Cédric Boivin
la source

Réponses:

568

Essayer SelectMany()

var result = iList.SelectMany( i => i );
Mike Two
la source
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;
récursif
la source
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()
Dylan Beattie
la source
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);
mqp
la source
11

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

List<int> flatList= k.SelectMany( v => v).ToList();
Daniel
la source