2008-09-29 6 views
15

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

31

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é.

2

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).

0

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; 
    } 
} 
+0

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. –

+0

@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

0

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.

0

Voici une autre compréhension de requête LINQ.

IEnumerable<string> myStrings = 
    from a in mySource 
    from b in a 
    select b; 
7

Que diriez-vous

myStrings.SelectMany(x => x) 
+0

bonne solution, avec une petite faute de frappe –

+0

Merci. Mise à jour de la faute de frappe – JaredPar