Как отсортировать коллекцию на основе свойства вложенной коллекции - PullRequest
6 голосов
/ 13 августа 2010

Я хотел бы отсортировать коллекцию на основе свойства подколлекции.

//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 в качестве параметра.

Как мне отсортировать List, но используя выражения LINQ / Lambda во внутренней коллекции Salaries?

Итак, я бы получил:

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

Ответы [ 2 ]

8 голосов
/ 13 августа 2010

Для меня это выглядит так:

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.

(Вышеприведенное не даст такой же результат, но как только вы получите человека и его зарплату, вы можете получить другие значения.)

2 голосов
/ 13 августа 2010

Похоже, логика Джона верна, но пример кода не соответствует 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);
}
...