TOC

This article has been localized into Chinese by the community.

LINQ:

LINQ: 查询语法与方法语法

在之前的文章中,我们快速了解了 LINQ 的两种语法形式,这里我们把这两种语法放在一起再次展示出来,这样,你就能确定在本文中我们所讨论的内容。

 var listOfNames = new List<string>()
{
    "John Doe",
    "Jane Doe",
    "Jenna Doe",
    "Joe Doe"
};

// Query syntax
var qNames = from name in listOfNames where name.Length <= 8 select name;
// Method syntax
var mNames = listOfNames.Where(name => name.Length <= 8);

虽然这两行都完成了同样的一件事,但是语法的区别还是相当大的:一方面,查询语法更像其他查询语言而不是 C# 语句,比如 SQL 语句;另一方面,方法语法更像你在本教程看到的其他 C# 代码。

因此,二者之间最大的差异就是语法。同样地,在阅读 C# 的相关文章以及寻找问题的答案时,你也会看到这两种形式。一方面,看起来查询语法稍微更加流行一点,因为有人发现这种形式比方法语法更加容易阅读;另一方面,如果你之前从未用过查询语言,比如 SQL,并且有过一些 C# 的经验,那么你可能认为方法语法更加容易阅读。另外,对于一些操作而言,比如说计算查询结果的项目数目,你只能使用方法语法来实现。

Lambda 表达式

在方法语法的例子当中,你可能发现一些你之前从未见过的东西,比如 Where() 方法中的参数,它看起来就像这样:

name => name.Length <= 8

这叫做 Lambda 表达式,虽然它并不是 LINQ 功能中的某个部分,但它在 LINQ 技术中得到了大量使用。因此,你会在之后的文章中多次看到它,虽然我将在另一篇文章中详细介绍 Lambda 表达式,但在这里确实是一个非常好的时机来了解它时如何工作的。

Lambda 表达式十分简单。一个 Lambda 表达式包含左侧和右侧,由符号=>将其分开。注意的是不要将它和大于等于符号(>=)弄混淆。

左侧部分是输入参数。输入参数可以是多个,但在我们的例子当中,只有一个输入参数,即变量 name,它来自于 Where() 方法,通过遍历我们的名字列表来选择各个名字。这里,我选择 “name”,因为这能在名字列表中获取得到,但你也可以使用其他变量,比如 “x”、“z”、“foobar” 亦或者其他东西。

右侧部分是表达式/语句部分。该部分也是我们生成期望结果的地方。在本例中,布尔值告诉 Where() 方法是否包含符合某个问题的名字。我们用一个表达式来回答,告诉它我们想要包含字符长度不超过8个的名字。我们可以(但不是必须)使用输入(左侧部分)来决定这一点。另外,我们把输入定为 “name“,但是我们可以将其称为 ”x“,这样,这条语句就会变成如下形式:

var mNames = listOfNames.Where(x => x.Length <= 8);

Lambda 表达式不仅仅是 LINQ 的查询,但如上所述,在使用 LINQ 时非常重要,这一点在之后的文章中可以看到。如果你想了解更多关于 Lambda 表达式的信息,请查看本教程其他涉及到 Lambda 表达式的主题。

概述

LINQ 有两种语法风格:查询语法和方法语法。他们几乎可以做同样的事情,但是查询语法几乎是 C# 中的新语言,而方法语法更像普通的 C# 方法调用。在本教程中,当在之后的文章中讨论 LINQ 中所有的可用操作符时,我们基本上将使用方法语法来讲述


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!