2010-01-14 25 views
6

Ich habe die folgende KlasseLINQ: Wie Liste der Elemente anhänge in einer anderen Liste

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

Bei einem List<Element>, wie Sie eine Liste aller Ints innerhalb der List<Element> LINQ zu finden?

kann ich den folgenden Code

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

Aber es ist verwenden, so hässlich und langatmig, dass ich jedes Mal, wenn ich es schreiben erbrechen will.

Irgendwelche Ideen?

Antwort

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

oder vielleicht auch nur:

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

btw, werden Sie wahrscheinlich wollen die Liste initialisieren:

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

Gibt es einen Grund, warum Sie "neue Liste (x)" statt "x.ToList()" verwendet? –

+1

@Andrew nicht besonders; funktioniert entweder usw –

3

Sie einfach SelectMany verwenden können, ein Abflachen List<int> zu bekommen:

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

... oder Aggregieren:

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