如何根据子集合属性对集合进行排序
我想根据子集合属性对集合进行排序。如何根据子集合属性对集合进行排序
//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
对我来说,这看起来像:
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
条款的扁平化效果。
(以上将不提供完全相同的输出,但一旦你得到的人和他们的薪水,你可以在其他值获得。)
这种种薪水,独立在外的集合。如果海报关心列表中是否包含“Johanna:30000,Junior:70000,Johanna:75000,Junior:80000”,或者他希望成为Johanna:30000,Johanna:75000,Junior:70000,Junior:80000 ' – Marc 2010-08-12 20:26:07
@Marc:这是真的......但是,当它被接受时,我认为这就是想要的。 – 2010-08-12 20:27:32
不应该''写'()'比仅包含'pair'更详细一点? – 2013-02-15 11:05:24
它看起来像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);
}
谢谢,我已经修复了我的orderby子句。我没有改变投影 - 我认为,一旦你有人和薪水,你可以打印任何你想要的东西,剩下的东西。 – 2010-08-12 20:16:32
这两个评论都很好,谢谢你 – 2010-08-12 20:25:54
@Jon:谢谢你的支持。 :-) – 2010-08-12 22:45:47
代码缺乏工资列表字段的初始化一个人(人[1]) – 2013-02-15 10:56:51