本文介绍能够用于在 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 varIEnumerable<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 queriesvar 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 syntaxint numCount1 = (from num in numbers1 where num < 3 || num > 7 select num).Count();// Better: Create a new variable to store// the method call resultIEnumerable<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();