2010-02-10 41 views
6

Dưới đây là các thiết lập:Sử dụng LINQ và C#, cố gắng để có được hai danh sách từ một danh sách các mục sư được phân nhóm theo hai danh sách nội

public class Parent 
{ 
    public List<Child> ChildrenA = new List<Child>(); 
    public List<Child> ChildrenB = new List<Child>(); 
} 

public class Child 
{ 
    public Child (string name) {Name=name;} 
    public string Name {get;set;} 
} 

Có các dữ liệu sau:

var parents = new List<Parent>(); 
parents.Add (new Parent()); 
parents[0].ChildrenA.Add (new Child("A1")); 
parents[0].ChildrenA.Add (new Child("A2")); 
parents[0].ChildrenB.Add (new Child("B1")); 
parents.Add (new Parent()); 
parents[1].ChildrenA.Add (new Child("A3")); 

Bây giờ tôi m cố gắng để có được kết quả sau trong ONE linq tuyên bố:

var result = ... // would be an anonymous type 

Assert.That (result.ChildrenA.Count, Is.EqualTo(3)); 
Assert.That (result.ChildrenA[0].Name, Is.EqualTo("A1")); 
Assert.That (result.ChildrenA[1].Name, Is.EqualTo("A2")); 
Assert.That (result.ChildrenA[2].Name, Is.EqualTo("A3")); 

Assert.That (result.ChildrenB.Count, Is.EqualTo(1)); 
Assert.That (result.ChildrenB[0].Name, Is.EqualTo("B1")); 

Tôi đã thử nhóm, sử dụng selectmany, join và tôi ca dường như không tìm được cách thích hợp.

Bất kỳ Linq wiz xung quanh?

PS: Ngoài ra, tôi muốn đi qua danh sách tổng thể chỉ một lần ...;)

Trả lời

3
var result = parents.Aggregate(
        new 
        { 
         ChildrenA = Enumerable.Empty<Child>(), 
         ChildrenB = Enumerable.Empty<Child>() 
        }, 
        (a, p) => new 
           { 
            ChildrenA = a.ChildrenA.Concat(p.ChildrenA), 
            ChildrenB = a.ChildrenB.Concat(p.ChildrenB) 
           }); 

này về cơ bản là tương đương với:

var result = new 
      { 
       ChildrenA = Enumerable.Empty<Child>() 
             .Concat(parents[0].ChildrenA) 
             .Concat(parents[1].ChildrenA) 
             .Concat(parents[2].ChildrenA) 
             ..., 

       ChildrenB = Enumerable.Empty<Child>() 
             .Concat(parents[0].ChildrenB) 
             .Concat(parents[1].ChildrenB) 
             .Concat(parents[2].ChildrenB) 
             ... 
      }; 

Có lẽ hiệu quả hơn để sử dụng POFL (vòng lặp foreach cũ):

var childrenA = new List<Child>(); 
var childrenB = new List<Child>(); 

foreach (var parent in parents) 
{ 
    childrenA.AddRange(parent.ChildrenA); 
    childrenB.AddRange(parent.ChildrenB); 
} 

var result = new 
      { 
       ChildrenA = childrenA, 
       ChildrenB = childrenB 
      }; 
+0

Inter esting ... Tôi không chắc chắn lý do tại sao nó hoạt động mặc dù và nếu nó là tối ưu ... –

+0

Tôi sợ hiệu suất của Concat trên một danh sách có chứa hàng trăm mặt hàng ... Bạn phải có lẽ tôi chỉ nên sử dụng một vòng lặp foreach. –

Các vấn đề liên quan