2010-01-14 32 views
6

Tôi đã lớp sauLINQ: Làm thế nào để Nối Danh sách Elements Into Một Danh sách

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

Cho một List<Element>, làm thế nào để tìm thấy một danh sách của tất cả các bên trong IntsList<Element> sử dụng LINQ?

tôi có thể sử dụng đoạn mã sau

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

Nhưng đó là quá xấu xí và dài hơi mà tôi muốn nôn mửa mỗi khi tôi viết nó.

Bất kỳ ý tưởng nào?

Trả lời

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

hoặc có thể chỉ:

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

btw, có thể bạn sẽ muốn khởi danh sách:

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

Có lý do nào bạn sử dụng "Danh sách mới (x)" thay vì "x.ToList()" không? –

+1

@Andrew không đặc biệt; hoặc là hoạt động, v.v. –

3

Bạn chỉ có thể sử dụng SelectMany để có được một flatten List<int>:

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

... hoặc tổng hợp:

List<Elements> elements = ... // Populate  
List<int> intsList = elements.Aggregate(Enumerable.Empty<int>(), (ints, elem) => ints.Concat(elem.Ints)).ToList(); 
Các vấn đề liên quan