您的位置:首页 > 其它

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 列表初始化后,输入如下所示的查询:
//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))

输出结果和暂停屏幕显示的代码与前面示例中的相同,只是消息有一点儿变化,这里不再重复。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: