您的位置:首页 > 其它

LINQ 标准的查询操作符 排序 orderby、thenby、Take

2009-10-06 21:28 471 查看
要对序列排序,前面使用了 orderby  子句。下面复习一下前面使用 orderby descending  子句的例子。其中
赛手按照赢得比赛的次数进行降序排序,赢得比赛的次数是用关键字选择器指定的:

private static void Ordering()
{

var racers = from r in Formula1.GetChampions()
where r.Country == "Brazil"
orderby r.Wins descending
select r;

foreach (var racer in racers)
{
Console.WriteLine("{0:C}: {0:L}, {0:F}", racer);  //属性名的第一个字母
}

}


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<TSource>。这个接口派生于接口

IEnumerable<TSource>,但包含一个额外的方法CreateOrderedEnumerable- <TSource>()。

这个方法用于进一步给序列排序。

如果根据关键字选择器来排序,两项的顺序相同,就可以使用 ThenBy()和 ThenByDescending  ()方法继续排序。

这两个方法需要 IOrderEnumerable<TSource>才能工作,但也返回这个接口。

所以,可以添加任意多个 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);  //属性名的第一个字母
}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: