登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学无止境

一点积累,与大家分享

 
 
 

日志

 
 

如何:在 C# 中编写 LINQ 查询  

2009-12-08 12:17:48|  分类: C#技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

本主题演示在 C# 中编写 LINQ 查询的三种方式:

  1. 使用查询语法。

  2. 使用方法语法。

  3. 组合使用查询语法和方法语法。

下面的示例使用前面列出的每种方式演示一些简单的 LINQ 查询。一般的规则是尽可能使用 (1),而在必要时使用 (2) 和 (3)。

如何:在 C 中编写 LINQ 查询 - 秋的季节 - 秋的博客说明:

这些查询作用于简单的内存中集合;但是,基本语法与 LINQ to SQL 和 LINQ to XML 中使用的语法相同。

如何:在 C 中编写 LINQ 查询 - 秋的季节 - 秋的博客  示例

查询语法

编写大多数查询的推荐方式是使用查询语法来创建查询表达式。下面的示例演示了三个查询表达式。第一个查询表达式演示如何通过用 where 子句应用条件来筛选或限制结果,它返回源序列中值大于 7 或小于 3 的所有元素。第二个表达式演示如何对返回的结果进行排序。第三个表达式演示如何按照键对结果进行分组,此查询可根据单词的第一个字母返回两个组。

C#
// Query #1.
List<int> numbers = new List<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

// The query variable can also be implicitly typed by using var
IEnumerable<int> filteringQuery =
from num in numbers
where num < 3 || num > 7
select num;

// Query #2.
IEnumerable<int> orderingQuery =
from num in numbers
where num < 3 || num > 7
orderby num ascending
select num;

// Query #3.
string[] groupingQuery = { "carrots", "cabbage", "broccoli", "beans", "barley" };
IEnumerable<IGrouping<char, string>> queryFoodGroups =
from item in groupingQuery
group item by item[0];

请注意,这些查询的类型是 IEnumerable<(Of <(T>)>)。所有这些查询都可以使用 var 编写,如下面的示例所示:

var query = from num in numbers...

在上述每个示例中,直到您在 foreach 语句中循环访问查询变量时,查询才会实际执行。有关更多信息,请参见 LINQ 查询介绍

方法语法

某些查询操作必须表示为方法调用。最常见的此类方法是那些返回单一数值的方法,如 SumMaxMinAverage 等。这些方法在任何查询中都必须总是最后调用,因为它们仅表示单个值,不能充当其他查询操作的数据源。下面的示例演示查询表达式中的方法调用:

C#
List<int> numbers1 = new List<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
List<int> numbers2 = new List<int>() { 15, 14, 11, 13, 19, 18, 16, 17, 12, 10 };
// Query #4.
double average = numbers1.Average();

// Query #5.
IEnumerable<int> concatenationQuery = numbers1.Concat(numbers2);

如果该方法具有参数,则这些参数以 lambda 表达式的形式提供,如下面的示例所示:

C#
// Query #6.
IEnumerable<int> largeNumbersQuery = numbers2.Where(c => c > 15);

在上述查询中,只有查询 4 立即执行。这是因为它返回单个值,而不是一个泛型 IEnumerable<(Of <(T>)>) 集合。方法本身必须使用 foreach 才能计算它的值。

上述每个查询都可以通过结合使用隐式类型化与 var 进行编写,如下面的示例所示:

C#
// var is used for convenience in these queries
var average = numbers1.Average();
var concatenationQuery = numbers1.Concat(numbers2);
var largeNumbersQuery = numbers2.Where(c => c > 15);

混合的查询和方法语法

此 示例演示如何对查询子句的结果使用方法语法。只需将查询表达式括在括号内,然后应用点运算符并调用此方法。在下面的示例中,查询 7 返回其值在 3 和 7 之间的数字个数。但是,通常更好的做法是使用另一个变量来存储方法调用的结果。这样就不太容易将查询本身与查询结果相混淆。

C#
// Query #7.

// Using a query expression with method syntax
int numCount1 =
(from num in numbers1
where num < 3 || num > 7
select num).Count();

// Better: Create a new variable to store
// the method call result
IEnumerable<int> numbersQuery =
from num in numbers1
where num < 3 || num > 7
select num;

int numCount2 = numbersQuery.Count();

由于查询 7 返回单个值而不是一个集合,因此该查询立即执行。

上述查询可以通过结合使用隐式类型化与 var 进行编写,如下所示:

var numCount = (from num in numbers...

它可以按如下方式使用方法语法进行编写:

var numCount = numbers.Where(n => n < 3 || n > 7).Count();

它可以按如下方式使用显式类型化进行编写:

int numCount = numbers.Where(n => n < 3 || n > 7).Count();
  评论这张
 
阅读(492)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018