Si j'ai une variable de type IEnumerable<List<string>>
, y a-t-il une instruction LINQ ou une expression lambda que je peux appliquer et qui va combiner les listes retournant IEnumerable<string>
?Combinaison de listes dans Lambda/LINQ
Répondre
SelectMany - à savoir
IEnumerable<List<string>> someList = ...;
IEnumerable<string> all = someList.SelectMany(x => x);
Pour chaque élément somelist, celui-ci utilise alors le lambda "x => x" pour obtenir un IEnumerable <T> pour les éléments internes. Dans ce cas, chaque "x" est une Liste <T>, qui est déjà IEnumerable <T>.
Elles sont ensuite renvoyées en tant que bloc contigu. Essentiellement, 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 légèrement simplifié.
Pas exactement un seul appel de méthode, mais vous devriez être en mesure d'écrire
var concatenated = from list in lists from item in list select item;
Où des « listes » est votre IEnumerable<List<string>>
et concaténées est de type IEnumerable<string>
.
(Techniquement, cette est un seul appel de méthode pour SelectMany
-. Il ne ressemble pas à c'était tout ce que je voulais dire par la déclaration liminaire Je voulais juste éclaircir cela au cas où quelqu'un est embrouillé ou commenté - j'ai réalisé après avoir posté comment il aurait pu lire).
Faire 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;
}
}
utilisant 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 requête LINQ.
IEnumerable<string> myStrings =
from a in mySource
from b in a
select b;
Que diriez-vous
myStrings.SelectMany(x => x)
bonne solution, avec une petite faute de frappe –
Merci. Mise à jour de la faute de frappe – JaredPar
Et aucune raison de ne pas l'utiliser si vous utilisez .NET 3.5 (que l'on peut supposer de l'OP), ou C# 3.0 avec .NET 2.0 et LinqBridge. –
@Marc: Vous avez raison, surtout s'il y a un moyen simple de "linqish". Parfois, les gens essaient simplement de faire quelque chose de la manière LINQ et de rendre les choses simples plus difficiles à saisir. – VVS