如何将Lambda表达式翻译成英文?

6

我是一名会VB.NET和一些C#编程语言的程序员。最近我接触到了 lambda表达式,在VB中可以这样写:

a = Function() b + c

然而,在C#中它们看起来像这样:(链接)

a => b + c;

对我而言,它看起来很像C语言中的一个奇怪的指针表达式。

问题在于当我阅读C#代码时,我会心理将操作符解析成英语单词。因此 a = b + c; 变成了“将b和c相加并赋值给a”。然而,我内置解析器中对于 => 操作符没有心理翻译,所以 a => b + c; 变成了“a等于指向b和c的指针”,这没有意义;或者是“a是b和c的lambda”,这太可怕了。

我相信语言创建者的意思是让该运算符代表一个概念,并且该概念应该能够被简化为一个单词或非常短的短语。

那么,=> 运算符的预期英语翻译是什么?

p.s. 请注意,我尝试让示例尽可能简单,以免陷入具体细节。


获取 a 并返回 b + c?你的 lambda 不是一个好的例子。让我们想象一些像 a => a.ToString() 这样的东西,它的意思是“获取 a 并返回 a 的字符串表示形式”。 - Dmitry
a是函数b+c吗?这样它就能与您的VB.NET经验保持一致。 - Me.Name
6个回答

7
你的例子有些不对。
这段VB代码:
a = Function()
  Return b + c
End Function

在C#中,看起来是这样的:

Func<int> a = () => b + c;

使用“返回”来称呼 => 的问题在于,这并不适用于没有返回值的 lambda 表达式:
例如:
Action a = () => Console.WriteLine("Test");

如果你在这种情况下把=>称为“返回”,我认为会有点混淆。
一般来说,=>使用的术语是“goes to”,但有些人说“maps to”或(在用作谓词的lambda的情况下)“such that”。
我个人偏爱“maps to”(正如第一个回复OP所建议的那样!)。

+1 for "such that",并给出一个全面的回答。正如你所提到的,由于我主要在谓词中使用lambda表达式,“such that”非常有意义,但在其他情况下可能不太适用。 - helrich

5
如何理解“a返回b加c”?

3
在数学中,=> 符号表示 蕴含,但由于某些原因,c# 将其称为 Lambda 运算符。这将不容易阅读,如 a Lambda 运算符b 加上 c
因此,您可以简单地将 a 蕴含 b 加上 c

2

举个例子:

var person = GetRandomPerson();

string firstname = person.Select(a => a.FirstName);

我知道这在语法上很困难。但在这种情况下,aperson 变量。由于你可以在 lambda 表达式中自由选择该名称,因此像这样理解会更容易:

string firstname = person.Select(person => person.FirstName);

请记住,person变量和personlambda声明之间没有任何联系(不管它叫什么)。如果您选择,可以完全选择不同的名称。
=>之前的aperson部分基本上是一个声明。
如果您想用语言表达出来(就像您要求的那样):a => a.FirstName等同于“如果我的项目名为'a',则请给我'a'的FirstName”。
这就是在单个情况下发生的事情(即只有一个人从中选择一个字段)。
那么如果您手头持有一个人员名单会发生什么呢?
var persons = GetRandomPersons();

List<string> firstnames = persons.Select(a => a.FirstName);

如果您的基本项(persons)是项目集合,则a指向每个单独的对象。 为了使其更易于理解:
List<string> firstnames = persons.Select(aSinglePerson => aSinglePerson.FirstName);

这段代码返回每个人的名字(FirstName)。假设它是一个字符串(string),那么将返回一个 IEnumerable<string>

可以把它想象成用 foreach 循环实现同样的功能:

foreach (var aSinglePerson in persons)
{
    var firstname = aSinglePerson.FirstName;

    ...

如果您希望用语言表达(就像您所要求的那样):对于多个项目,a => a.FirstName 相当于“在此集合中,按顺序获取每个单独的项目,称其为'a',并请给我'a'的FirstName'”。
我希望这解释了C#语法中lambda表达式的概念。

2
我经常会想到“goes to”这个词。

2

根据定义,=> 被称为 lambda 操作符。它们用于将输入(在左侧)与 lambda 主体(在右侧)分开。你的例子并不代表同样的事情。

在你的情况下,更有效的是

a = delegate() { b + c };

可以使用 lambda 简化为

a = () => b + c;

lambda 操作符不返回任何东西,它更像是 "去" 或 "使用"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接