2010-08-12 5 views
6

subcollection 속성을 기반으로 컬렉션을 정렬하고 싶습니다. 단지 테스트 목적 아래 subcollection 속성을 기반으로 컬렉션을 정렬하는 방법

//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를 사용하여 매개 변수로.

어떻게 목록을 정렬 할 수 있지만 급여 내부 컬렉션의 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

코드는 사람의 외부 콜렉션의 독립 (명 [I]) –

답변

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

주 - 정렬하고를 2 개의 from 조항을 가짐의 병합 효과가하는 것인 (사람, 급여)의 징수.

합니다 (위의 정확히 같은 출력을 제공하지 않습니다,하지만 당신은 그 사람과 자신의 급여를 가지고 일단 당신이 다른 값에 얻을 수 있습니다.)

+0

월급이 종류, 급여 목록 필드의 초기화 없다. "Johanna : 30000, Junior : 70000, Johanna : 75000, Junior : 80000' 또는 Johanna : 30000, Johanna : 75000, Junior : 70000, Junior : 80000을 원한다면 포스터가 신경 써야합니다. ' – Marc

+0

@Marc : 그건 사실입니다 ... 그러나 받아 들여지는대로, 나는 이것이 원하는 것이라고 생각합니다. –

+0

'Writeline()'은 단지'pair '를 포함하는 것보다 좀 더 정교해야하지 않습니까? –

2

존의 논리가 올 것이 보이지만, 샘플 코드가 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

고마워요, 제 주문서 조항을 고쳤습니다. 저는 프로젝션을 변경하지 않았습니다 - 당신이 그 사람과 월급을 받으면 당신이 원하는 비트를 인쇄하고 나머지는 남겨 둘 수 있습니다. –

+0

두 의견 모두 훌륭했습니다. 감사합니다. –

+0

@ 존 : 내 nitpicking을 참아 주셔서 감사합니다. :-) –

관련 문제