乐趣区

关于linq:在C中编写LINQ查询

本文介绍能够用于在 C# 中编写 LINQ 查问的三种办法:

  1. 应用查问语法。
  2. 应用办法语法。
  3. 联合应用查问语法和办法语法。

上面的示例演示应用后面列出的每种办法的一些简略 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();
退出移动版