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

时间:2014-04-22 09:51:40

标签: c# vb.net lambda

我是VB.NET程序员,也知道一些C#。我最近遇到了in VB can look like this

的lambda表达式
a = Function() b + c

然而in C# they look like this

a => b + c;

(对我来说,这看起来很像C中奇怪的指针表达式)

问题在于,在阅读C#代码时,我会在心理上将运算符解析为英语单词。因此,a = b + c;变为"添加b和c并分配给"。但是我的内置解析器中没有针对=>运算符的心理翻译,因此a => b + c;成为"等于指向b和c"没有任何意义或者" a是b和c"的lambda。这是可怕的。

我确信语言创建者意味着该运营商代表一个概念,并且该概念应该能够简化为一个单词或非常短的短语。

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

P.S。请注意,我已尽力使示例尽可能简单,以免陷入具体细节。

6 个答案:

答案 0 :(得分:7)

你的例子有点不对。

这个VB代码

a = Function()
  Return b + c
End Function

在C#中看起来像这样:

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

建议调用=>&#34;的问题会返回&#34;这是不能与不返回任何东西的lambdas一起工作的:

例如:

Action a = () => Console.WriteLine("Test");

如果你致电=>&#34;返回&#34;在那种情况下,我认为这会有点混乱。

通常,用于=>的术语是&#34;转到&#34;但有些人说&#34;映射到&#34;或者(在lambda用作谓词的情况下)&#34;这样&#34;。

我个人的偏好是&#34;映射到&#34; (正如对OP的第一次回复所建议的那样!)。

答案 1 :(得分:5)

'a返回b加c'怎么样?

答案 2 :(得分:3)

在数学中=>符号表示Implies但由于某种原因,c#将其称为Lambda operator。如a Lambda运算符bc

一样,阅读起来并不容易

因此,您只需致电a隐含bc

即可

答案 3 :(得分:2)

举个例子:

var person = GetRandomPerson();

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

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

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

请注意,person变量与person lambda声明(无论它叫什么)之间没有任何关联。如果您愿意,可以选择完全不同的名称。

a之前的person=>部分基本上是声明。

如果你想用文字(就像你问的那样):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'的第一个名称

我希望这能解释C#语法中lambda表达式背后的概念。

答案 4 :(得分:2)

我一直认为“自己去”。

答案 5 :(得分:2)

根据定义in =&gt;被称为lambda运算符。你习惯于将输入(左边)与lambda体(右边)分开。你的榜样不代表同样的事情。

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

a = delegate() { b + c };

可以使用lambda简化为

a = () => b + c;

lambda运算符不返回任何内容,更像是“转到”或“使用”。