Take和Skip
假定需要数据集中销售量位于前5名的顾客。我们事先并不知道这5名顾客的销售量是多少,所以不能使用where条件查找他们。
一些SQL数据库如Microsoft SQL Server实现了TOP运算符,所以可以执行命令SELECT Top 5 FROM …,获得前5名顾客的数据。
与这个操作对应的LINQ方法是Take(),它可以从查询结果中提取前n个结果。实际上,这个方法需要和orderby子句一起使用,才能获得前n个结果。但orderby子句并不是必需的,因为有时知道数据已经按指定的顺序排列好了,或者只需要前n个结果,而不必考虑它们的顺序。
Take()的反面是Skip(),它可以跳过前n个结果,返回剩余的结果。Take()和Skip()在LINQ文档说明中称为分区运算符,因为它们把结果集分为前n个结果(Take())和其余的结果(Skip())。
下面的示例对顾客列表数据使用了Take()和Skip()。
试试看:使用Take()和Skip()
按照下面的步骤在Visual Studio 2008中创建示例:
(1) 在C:\BegVCSharp\Chapter26目录下创建一个新的控制台应用程序26-13-TakeAndSkip。
(2) 从26-7-QueryComplexObjects示例中复制创建Customer类的代码和初始化顾客列表(List<Customer> customers)的代码。
(3) 在Main()方法中,在customers 列表初始化后,输入如下所示的查询:
//query syntax |
(4) 输入两个结果处理循环,一个使用Take(),另一个使用Skip():
Console.WriteLine("Top Five Customers by Sales"); Console.WriteLine("Customers Not In Top Five"); |
(5) 编译并执行程序,结果显示的是前5名顾客和剩余的顾客:
Top Five Customers by Sales |
示例的说明
Customer类和customers 列表的初始化与前面例子中的相同。
主查询由查询语法的from…orderby…select语句组成,类似于本章前面创建的查询,只是其中没有where子句,因为我们要获得所有的顾客(按从高到低的销售量排序):
var queryResults = |
这个示例与前面的示例略有不同:这个示例在对查询结果执行foreach循环之前,并没有应用运算符,因为本例要重用查询结果。首先使用Take(5)获得前5名顾客:
foreach (var item in queryResults.Take(5)) |
接着使用Skip(5)跳过前5项(这些项刚才已经输出了),从原来的查询结果集中输出剩余的顾客:
foreach (var item in queryResults.Skip(5)) |
输出结果和暂停屏幕显示的代码与前面示例中的相同,只是消息有一点儿变化,这里不再重复。