2010-08-12 198 views
6

我想根據子集合屬性對集合進行排序。如何根據子集合屬性對集合進行排序

//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;} 
} 

下面只是用於測試目的,我準備我的人收集與工資內收集每一個:

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 }); 

現在我們要排序的人收藏,但使用自己的內心收集SalaryValue作爲參數。

我如何排序列表,但在Salaries內部集合上使用LINQ/Lambda表達式?

因此,我將有:

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

代碼缺乏工資列表字段的初始化一個人(人[1]) – 2013-02-15 10:56:51

回答

8

對我來說,這看起來像:

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); 
} 

注意,你沒有真正的排序集合 - 你選一個(人,工資)的集合,這是兩個from條款的扁平化效果。

(以上將不提供完全相同的輸出,但一旦你得到的人和他們的薪水,你可以在其他值獲得。)

+0

這種種薪水,獨立在外的集合。如果海報關心列表中是否包含「Johanna:30000,Junior:70000,Johanna:75000,Junior:80000」,或者他希望成爲Johanna:30000,Johanna:75000,Junior:70000,Junior:80000 ' – Marc 2010-08-12 20:26:07

+0

@Marc:這是真的......但是,當它被接受時,我認爲這就是想要的。 – 2010-08-12 20:27:32

+0

不應該''寫'()'比僅包含'pair'更詳細一點? – 2013-02-15 11:05:24

2

它看起來像Jon的邏輯是正確的,但示例代碼與OP的不匹配。它可能應該是更喜歡這樣的:

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

謝謝,我已經修復了我的orderby子句。我沒有改變投影 - 我認爲,一旦你有人和薪水,你可以打印任何你想要的東西,剩下的東西。 – 2010-08-12 20:16:32

+0

這兩個評論都很好,謝謝你 – 2010-08-12 20:25:54

+0

@Jon:謝謝你的支持。 :-) – 2010-08-12 22:45:47

相關問題