2010-01-14 19 views
6

He la siguiente claseLINQ: Cómo anexar lista de elementos en otra lista

public class Element 
{ 
    public List<int> Ints 
    { 
    get;private set; 
    } 
} 

Dado un List<Element>, cómo encontrar una lista de todos los Ints dentro del List<Element> usando LINQ?

puedo usar el siguiente código

public static List<int> FindInts(List<Element> elements) 
{ 
var ints = new List<int>(); 
foreach(var element in elements) 
{ 
    ints.AddRange(element.Ints); 
} 
return ints; 
} 
} 

pero es tan feo y largo aliento que me dan ganas de vomitar cada vez que lo escribo.

¿Alguna idea?

Respuesta

10
return (from el in elements 
     from i in el.Ints 
     select i).ToList(); 

o tal vez sólo:

return new List<int>(elements.SelectMany(el => el.Ints)); 

por cierto, es probable que desee para inicializar la lista:

public Element() { 
    Ints = new List<int>(); 
} 
+0

¿Hay una razón que utilizó "nueva lista de (x)" en lugar de "x.ToList()"? –

+1

@Andrew no especialmente; cualquiera de los trabajos, etc. –

3

Usted puede simplemente utilizar SelectMany para obtener una aplanar List<int>:

public static List<int> FindInts(List<Element> elements) 
{ 
    return elements.SelectMany(e => e.Ints).ToList(); 
} 
0

... o agregación:

List<Elements> elements = ... // Populate  
List<int> intsList = elements.Aggregate(Enumerable.Empty<int>(), (ints, elem) => ints.Concat(elem.Ints)).ToList(); 
Cuestiones relacionadas