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>?

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top