要对序列排序,前面使用了orderby子句。下面复习以下前面使用的例子,但这里使用orderby descending子句。其中赛车手按照赢得比赛的次数进行降序排序,赢得比赛的次数用关键字选择器指定:
static void SortDescending()
{
var racers = from r in Formula1.GetChampions()
where r.Country == "Italy"
orderby r.Wins descending
select r.FirstName;
foreach(var r in racers)
{
System.Console.WriteLine(r);
}
}
输出如下:
Alberto
Nino
orderby子句解析为OrderBy()方法,orderby descending子句解析为OrderByDescending()方法:
var racers = Formula1.GetChampions()
.Where(r=>r.Country == "Italy")
.OrderByDescending(r=>r.Wins)
.Select(r=>r.FirstName);
OrderBy()和OrderByDescending()方法返回IOrderEnumerable<TSource>。这个接口派生自IEnumerable<TSource>接口,但包含一个额外的方法CreateOrderedEnumerable<TSource>()。这个方法用于进一步给序列排序。如果根据关键字选择器来排序,其中有两项相同,就可以使用ThenBy()和ThenDescending()方法继续排序。这两个方法需要IOrderEnumerable<TSource>接口才能工作,但也返回这个接口。所以,可以添加任意多个ThenBy()和TheDescending()方法,对集合排序。
使用LINQ查询时,只需要把所有用于排序的不同关键字(用逗号分隔开)添加到orderby子句中。在下例中,所有的赛车手先按照国家排序,再按照姓氏排序,最后按照名字排序。添加到LINQ查询结果中的Take()扩展方法用于返回前10个结果:
static void SortMultiple()
{
var racers = (from r in Formula1.GetChampions()
orderby r.Country,r.LastName,r.FirstName
select r).Take(10);
foreach(var r in racers)
{
System.Console.WriteLine($"{r:A}");
}
}
使用OrderBy()和ThenBy()扩展方法可以执行相同的操作:
var racers = Formula1.GetChampions()
.OrderBy(r=>r.Country)
.ThenBy(r=>r.LastName)
.ThenBy(r=>r.FirstName)
.Take(10);