本文介绍能够用于在 C# 中编写 LINQ 查问的三种办法:
- 应用查问语法。
- 应用办法语法。
- 联合应用查问语法和办法语法。
上面的示例演示应用后面列出的每种办法的一些简略 LINQ 查问。
备注
这些查问对简略的内存中汇合进行操作;然而,根本语法等同于在 LINQ to Entities 和 LINQ to XML 中应用的语法。
示例 – 查问语法
编写大多数查问的举荐形式是应用查问语法创立查问表达式。上面的示例演示三个查问表达式。第一个查问表达式演示如何通过利用蕴含 where
子句的条件来筛选或限度后果。它返回源序列中值大于 7 或小于 3 的所有元素。第二个表达式演示如何对返回的后果进行排序。第三个表达式演示如何依据某个键对后果进行分组。此查问基于单词的第一个字母返回两个组。
// 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。能够应用 var
编写所有这些查问,如上面的示例所示:
var query = from num in numbers...
在后面的每个示例中,在 foreach
语句或其余语句中循环拜访查问变量之前,查问不会理论执行。无关详细信息,请参阅 LINQ 查问介绍。
示例 – 办法语法
某些查问操作必须示意为办法调用。最常见的此类办法是可返回繁多数值的办法,例如 Sum、Max、Min、Average 等。这些办法在任何查问中都必须始终最初一个调用,因为它们只示意单个值,不能用作其余查问操作的源。上面的示例演示查问表达式中的办法调用:
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);
如果办法具备 Action 或 Func 参数,则这些参数以 lambda 表达式的模式提供,如上面的示例所示:
// Query #6.
IEnumerable<int> largeNumbersQuery = numbers2.Where(c => c > 15);
在下面的查问中,只有查问 #4 立刻执行。这是因为它将返回单个值,而不是泛型 IEnumerable 汇合。该办法自身必须应用 foreach
能力计算其值。
下面的每个查问能够通过 var 应用隐式类型化进行编写,如上面的示例所示:
// 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 之间的数字进行的计数。然而通常状况下,最好应用另一个变量存储办法调用的后果。采纳此办法时,查问不太可能与查问的后果相混同。
// 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();