LINQ 按多个字段排序(orderby、thenby、Take)
orderby 子句解析为OrderBy()方法,orderby descending 子句解析为OrderBy Descending()方法:
var racers = Formula1.GetChampions().
Where(r = >r.Country == "Brazil").
OrderByDescending(r = >r.Wins).
select(r = > r);
OrderBy() 和OrderByDescending ()方法返回IOrderEnumerable。这个接口派生于接口
IEnumerable,但包含一个额外的方法CreateOrderedEnumerable- ()。
这个方法用于进一步给序列排序。
如果根据关键字选择器来排序,两项的顺序相同,就可以使用ThenBy()和ThenByDescending ()方法继续排序。这两个方法需要IOrderEnumerable才能工作,但也返回这个接口。
所以,可以添加任意多个ThenBy()和ThenByDescending ()方法,对集合排序。
使用LINQ 查询时,只需把所有用于排序的不同关键字(用逗号分隔开)添加到orderby 子句中。
这里,
所有的赛手先按照国家排序,再按照姓氏排序,最后按照名字排序。
添加到LINQ 查询结果中的Take()扩展方法用于提取前10 个结果:
private static void Ordering()
{
var racers = (from r in Formula1.GetChampions()
orderby r.Country, r.LastName, r.FirstName
select r).Take(10);
foreach(var racer in racers)
{
Console.WriteLine("{0:C}: {0:L}, {0:F}", racer); //属性名的第一个字母}
}
Lambda
达式使用OrderBy()和ThenBy()方法可以执行相同的操作:
private static void Ordering()
{
var racers = Formula1.GetChampions().
OrderBy(r =>r.Country).
ThenBy(r =>r.LastName).
ThenBy(r =>r.FirstName).
Take(10);
foreach(var racer in racers)
{
Console.WriteLine("{0:C}: {0:L}, {0:F}", racer); //属性名的第一个字母}
}