Combinaison de listes dans Lambda / LINQ
Question
Si j'ai une variable de type IEnumerable<List<string>>
, puis-je lui appliquer une instruction LINQ ou une expression lambda qui combinera les listes renvoyant un IEnumerable<string>
?
La solution
SelectMany - c'est-à-dire
IEnumerable<List<string>> someList = ...;
IEnumerable<string> all = someList.SelectMany(x => x);
Pour chaque élément de someList, ceci utilise alors le lambda " x = > x " pour obtenir un IEnumerable < T > pour les articles intérieurs. Dans ce cas, chaque & Quot; x & Quot; est une liste < T > ;, qui est déjà IEnumerable < T >.
Celles-ci sont ensuite renvoyées sous forme de bloc contigu. En gros, SelectMany est quelque chose comme (simplifié):
static IEnumerable<TResult> SelectMany<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, IEnumerable<TResult>> selector) {
foreach(TSource item in source) {
foreach(TResult result in selector(item)) {
yield return result;
}
}
}
Bien que cela soit quelque peu simplifié.
Autres conseils
Que diriez-vous de
myStrings.SelectMany(x => x)
Pas exactement un seul appel de méthode, mais vous devriez être capable d'écrire
var concatenated = from list in lists from item in list select item;
Où "listes" est votre IEnumerable<List<string>>
et concaténé est du type IEnumerable<string>
.
(Techniquement, cela est un appel à une seule méthode pour SelectMany
- cela ne ressemble tout simplement pas à ce que je voulais dire par la déclaration d'ouverture. Je voulais juste clarifier cela au cas où quelqu'un aurait confus ou commenté - j’ai réalisé après avoir posté comment il aurait pu lire).
Faites une méthode simple. Pas besoin de LINQ:
IEnumerable<string> GetStrings(IEnumerable<List<string>> lists)
{
foreach (List<string> list in lists)
foreach (string item in list)
{
yield return item;
}
}
Utilisation de l'expression LINQ ...
IEnumerable<string> myList = from a in (from b in myBigList
select b)
select a;
... fonctionne très bien. : -)
b
sera un IEnumerable<string>
et a
sera un string
.
Voici une autre compréhension de la requête LINQ.
IEnumerable<string> myStrings =
from a in mySource
from b in a
select b;