LINQ Take和Skip
2015-09-17 16:05
260 查看
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 列表初始化后,输入如下所示的查询:
(4) 输入两个结果处理循环,一个使用Take(),另一个使用Skip():
(5) 编译并执行程序,结果显示的是前5名顾客和剩余的顾客:
示例的说明
Customer类和customers 列表的初始化与前面例子中的相同。
主查询由查询语法的from…orderby…select语句组成,类似于本章前面创建的查询,只是其中没有where子句,因为我们要获得所有的顾客(按从高到低的销售量排序):
这个示例与前面的示例略有不同:这个示例在对查询结果执行foreach循环之前,并没有应用运算符,因为本例要重用查询结果。首先使用Take(5)获得前5名顾客:
接着使用Skip(5)跳过前5项(这些项刚才已经输出了),从原来的查询结果集中输出剩余的顾客:
输出结果和暂停屏幕显示的代码与前面示例中的相同,只是消息有一点儿变化,这里不再重复。
假定需要数据集中销售量位于前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 var queryResults = from c in customers orderby c.Sales descending select new { c.ID, c.City, c.Country, c.Sales } ; |
Console.WriteLine("Top Five Customers by Sales"); foreach (var item in queryResults.Take(5)) { Console.WriteLine(item); } Console.WriteLine("Customers Not In Top Five"); foreach (var item in queryResults.Skip(5)) { Console.WriteLine(item); } |
Top Five Customers by Sales { ID = A, City = New York, Country = USA, Sales = 9999 } { ID = R, City = Beijing, Country = China, Sales = 9000 } { ID = B, City = Mumbai, Country = India, Sales = 8888 } { ID = Q, City = London, Country = UK, Sales = 8000 } { ID = C, City = Karachi, Country = Pakistan, Sales = 7777 } Customers Not In Top Five { ID = P, City = Tehran, Country = Iran, Sales = 7000 } { ID = D, City = Delhi, Country = India, Sales = 6666 } { ID = O, City = Cairo, Country = Egypt, Sales = 6000 } { ID = E, City = Sao Paulo, Country = Brazil, Sales = 5555 } { ID = N, City = Los Angeles, Country = USA, Sales = 5000 } { ID = F, City = Moscow, Country = Russia, Sales = 4444 } { ID = M, City = Tokyo, Country = Japan, Sales = 4000 } { ID = G, City = Seoul, Country = Korea, Sales = 3333 } { ID = L, City = Jakarta, Country = Indonesia, Sales = 3000 } { ID = H, City = Istanbul, Country = Turkey, Sales = 2222 } { ID = T, City = Lima, Country = Peru, Sales = 2002 } { ID = K, City = Mexico City, Country = Mexico, Sales = 2000 } { ID = I, City = Shanghai, Country = China, Sales = 1111 } { ID = S, City = Bogot á , Country = Colombia, Sales = 1001 } { ID = J, City = Lagos, Country = Nigeria, Sales = 1000 } Program finished, press Enter/Return to continue: |
Customer类和customers 列表的初始化与前面例子中的相同。
主查询由查询语法的from…orderby…select语句组成,类似于本章前面创建的查询,只是其中没有where子句,因为我们要获得所有的顾客(按从高到低的销售量排序):
var queryResults = from c in customers orderby c.Sales descending select new { c.ID, c.City, c.Country, c.Sales } |
foreach (var item in queryResults.Take(5)) |
foreach (var item in queryResults.Skip(5)) |
相关文章推荐
- scrollview和listview 冲突 动态定listview高度
- BaseAdapter的使用
- hash函数的简单介绍
- aidl理解
- 欢迎使用CSDN-markdown编辑器
- 重新学习C# 之 数据类型(一)
- 打开IDEA时报错“Failed to create JVM: error code -6”
- netback于kthread遇到cpu affinity问题
- HDU 5435
- 黑马程序员----便利构造器/代码块
- 在 Zend Studio 12.5 里下断点调试运行 PHP 源代码
- Linux signal() 信号处理函数
- 呈现报表时出现错误 索引超出范围
- Maven工程中报 Missing artifact jdk.tools:jdk.tools:
- Java中数组和集合容器的剖析
- 我所记录的git命令(非常实用)
- Android 增量更新APK
- HBase的ACID http://hbase.apache.org/acid-semantics.html
- 指针与数组
- 【IOS 开发学习总结-OC-8.1】★★ objective-c面向对象之——类和对象(上)