2008-09-29 21 views

Respuesta

31

SelectMany - es decir

 IEnumerable<List<string>> someList = ...; 
     IEnumerable<string> all = someList.SelectMany(x => x); 

para cada elemento de algunalista, este utiliza entonces la lambda "x => x" para obtener un IEnumerable <T> para los elementos interiores. En este caso, cada "x" es una lista <T>, que ya es IEnumerable <T>.

Estos se devuelven como un bloque contiguo. Esencialmente, SelectMany es algo así como (simplificado):

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

Aunque eso se simplifica un tanto.

2

No es exactamente una sola llamada a un método, pero debe ser capaz de escribir

var concatenated = from list in lists from item in list select item; 

Donde 'listas' es su IEnumerable<List<string>> y concatenada es de tipo IEnumerable<string>.

(Técnicamente esto es una sola llamada a un método para SelectMany -. Simplemente no parece que era todo lo que quería decir con la declaración de apertura Sólo quería aclarar eso en caso de que alguien se confundió o comentó - me di cuenta después de haber publicado cómo podría haberlo leído).

0

Haz un método simple. No hay necesidad de LINQ:

IEnumerable<string> GetStrings(IEnumerable<List<string>> lists) 
{ 
    foreach (List<string> list in lists) 
    foreach (string item in list) 
    { 
    yield return item; 
    } 
} 
+0

y no hay razón para no usarlo si está utilizando .NET 3.5 (que podemos asumir desde el OP), o C# 3.0 con .NET 2.0 y LinqBridge. –

+0

@Marc: tienes razón, especialmente si hay una manera fácil de "linqish". A veces las personas simplemente se esfuerzan por hacer algo de la manera LINQ y hacen que las cosas simples sean más difíciles de entender. – VVS

0

El uso de la expresión LINQ ...

IEnumerable<string> myList = from a in (from b in myBigList 
             select b) 
          select a; 

... funciona muy bien. :-)

b será un IEnumerable<string> y a será un string.

0

Aquí hay otra comprensión de consultas LINQ.

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

¿Qué tal

myStrings.SelectMany(x => x) 
+0

buena solución, con pequeño error tipográfico –

+0

Gracias. Actualizado el error tipográfico – JaredPar