LINQ Take和Skip

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
var queryResults =
from c in customers
orderby c.Sales descending
select new { c.ID, c.City, c.Country, c.Sales }
;

(4) 输入两个结果处理循环,一个使用Take(),另一个使用Skip():

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);
}

(5) 编译并执行程序,结果显示的是前5名顾客和剩余的顾客:

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循环之前,并没有应用运算符,因为本例要重用查询结果。首先使用Take(5)获得前5名顾客:

foreach (var item in queryResults.Take(5))

接着使用Skip(5)跳过前5项(这些项刚才已经输出了),从原来的查询结果集中输出剩余的顾客:

foreach (var item in queryResults.Skip(5))

输出结果和暂停屏幕显示的代码与前面示例中的相同,只是消息有一点儿变化,这里不再重复。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值