2010-08-12 14 views
6

Bir koleksiyona bir alt toplama özelliğine göre sıralamak istiyorum. Sadece test amaçlıdır Aşağıda Bir toplama, bir alt koleksiyon alanına dayanarak nasıl sıralanır

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

, ben Maaşlar iç koleksiyonları ile kişinin koleksiyonumu hazırlıyorum her biri:

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

Şimdi insanların Koleksiyonu sıralamak istiyorum, ama kendi iç toplama SalaryValue kullanarak parametre olarak.

Listeyi nasıl sıralayabilirim, ancak Malaries iç koleksiyonunda LINQ/Lambda ifadelerini nasıl kullanabilirim?

Yani olurdu: Bana göre

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

kod bir kişi için dış koleksiyonun bağımsız (insanlar [i]) –

cevap

8

böyle görünür: Eğer gerçekten kişilik bir koleksiyon sıralama değiliz

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

Not - Bir sıralama ediyoruz (Kişi, maaş), iki from cümleleri sahip düzleştirme etkisi ne olduğunu toplanması.

(yukarıda tam olarak aynı çıkış vermez, ancak kişi ve onların maaş var bir kere, diğer değerleri elde edebilirsiniz.)

+0

maaşla Bu sıralar, Maaşlar liste alanın başlatma yoksundur. Listenin 'Johanna: 30000, Junior: 70000, Johanna: 75000, Junior: 80000' içerip içermediğini ya da eğer bunu istiyorsa posterin umurundaysa, Johanna: 30000, Johanna: 75000, Junior: 70000, Junior: 80000 – Marc

+0

@Marc: Bu doğru ... ama kabul edildiği gibi, bunun istenen şey olduğunu farz ediyorum. –

+0

Writeline() 'sadece" çifti "ni içermekten biraz daha detaylandırılmamalıdır? –

2

Jon'un mantık doğruysa gibi, görünüyor ama örnek kod OP'lerle eşleşmiyor. Muhtemelen daha böyle olmalı:

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

Teşekkürler, siparişim hükmünü düzelttim. Ben projeksiyonu değiştirmedim - Ben şahsen ve maaşı aldığınızda, istediğiniz her şeyi yazdırabilir ve gerisini bırakabilirsiniz. –

+0

iki yorum harikaydı, teşekkürler millet –

+0

@Jon: Benim nitpicking ile koyarak için teşekkürler. :-) –

İlgili konular