2010-08-12 35 views
6

Tôi muốn sắp xếp bộ sưu tập dựa trên thuộc tính thu thập con.Cách sắp xếp bộ sưu tập dựa trên thuộc tính thu thập phụ

//the subcollection 
public class Salary 
{ 
    public int SalaryId {get;set;} 
    public int SalaryYear {get;set;} 
    public double SalaryValue {get;set;} //this is the field we want to sort the parent collection "Person" 
} 

//the main collection 
public class Person 
{ 
    public int PersonId {get;set;} 
    public string PersonName {get;set;} 
    public List<Salary> Salaries {get;set;} 
} 

Dưới đây chỉ dành riêng cho mục đích thử nghiệm, tôi đang chuẩn bị bộ sưu tập của tôi về người có lương bộ sưu tập nội mỗi người:

List<Person> people = new List<Person>(); 
//add two salaries for Junior 
people.Add(new Person { PersonId = 1, PersonName = "Junior" }); 
people[0].Salaries.Add(new Salary { SalaryId=1, SalaryYear=2011, SalaryValue=80000 }); 
people[0].Salaries.Add(new Salary { SalaryId=2, SalaryYear=2010, SalaryValue=70000 }); 

//add two salaries for Johanna 
people.Add(new Person { PersonId = 2, PersonName = "Johanna" }); 
people[0].Salaries.Add(new Salary { SalaryId=3, SalaryYear=2011, SalaryValue=40000 }); 
people[0].Salaries.Add(new Salary { SalaryId=4, SalaryYear=2010, SalaryValue=30000 }); 

Bây giờ chúng ta muốn sắp xếp bộ sưu tập người, nhưng sử dụng SalaryValue bộ sưu tập bên trong của họ làm tham số.

Làm cách nào để sắp xếp Danh sách nhưng sử dụng biểu thức LINQ/Lambda về Thu nhập bên trong tiền lương?

Vì vậy, tôi sẽ có:

PersonName: Johanna, SalaryValue=30000, SalaryYear=2010 
PersonName: Johanna, SalaryValue=40000, SalaryYear=2011 
PersonName: Junior, SalaryValue=70000, SalaryYear=2010 
PersonName: Junior, SalaryValue=80000, SalaryYear=2011 
+0

mã thiếu khởi tạo trường Danh sách lương cho một người (người [i]) –

Trả lời

8

Đối với tôi, giống như:

var query = from person in people 
      from salary in person.Salaries 
      orderby salary.SalaryValue 
      select new { person, salary }; 

foreach (var pair in query) 
{ 
    Console.WriteLine(pair); 
} 

Lưu ý rằng bạn không thực sự sắp xếp một bộ sưu tập của người - bạn đang sắp xếp một bộ sưu tập của (người, tiền lương), đó là những gì hiệu ứng làm phẳng của việc có hai điều khoản from.

(trên sẽ không cung cấp chính xác đầu ra tương tự, nhưng một khi bạn đã có con người và lương của họ, bạn có thể nhận được tại các giá trị khác.)

+0

Loại tiền lương này, độc lập với bộ sưu tập bên ngoài. Đó là mơ hồ nếu poster quan tâm nếu danh sách chứa 'Johanna: 30000, Junior: 70000, Johanna: 75000, Junior: 80000' hoặc nếu anh ta muốn nó là' Johanna: 30000, Johanna: 75000, Junior: 70000, Junior: 80000 ' – Marc

+0

@Marc: Đó là sự thật ... nhưng khi nó được chấp nhận, tôi cho rằng đây là những gì đã được mong muốn. –

+0

Không nên 'Writeline()' được thêm một chút chi tiết hơn là chỉ chứa 'cặp'? –

2

Có vẻ như logic Jon là đúng, nhưng mã mẫu không khớp với mã OP. Nó có thể giống như thế này:

var query = from person in people 
      from salary in person.Salaries 
      orderby salary.SalaryValue 
      select new { person.PersonName, salary.SalaryValue, salary.SalaryYear }; 

foreach (var tuple in query) 
{ 
    Console.WriteLine(tuple); 
} 
+0

Cảm ơn, tôi đã cố định điều khoản orderby của tôi. Tôi đã không thay đổi dự đoán - tôi hình dung khi bạn có người và tiền lương, bạn có thể in bất cứ thứ gì bạn muốn và để phần còn lại. –

+0

cả hai ý kiến ​​đều rất tuyệt vời, cảm ơn các bạn –

+0

@Jon: Cảm ơn bạn đã bỏ nitpicking của tôi. :-) –

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