我是VB.NET程序员,也知道一些C#。我最近遇到了in VB can look like this:
的lambda表达式a = Function() b + c
a => b + c;
(对我来说,这看起来很像C中奇怪的指针表达式)
问题在于,在阅读C#代码时,我会在心理上将运算符解析为英语单词。因此,a = b + c;
变为"添加b和c并分配给"。但是我的内置解析器中没有针对=>
运算符的心理翻译,因此a => b + c;
成为"等于指向b和c"没有任何意义或者" a是b和c"的lambda。这是可怕的。
我确信语言创建者意味着该运营商代表一个概念,并且该概念应该能够简化为一个单词或非常短的短语。
那么=>
运算符的预期英语翻译是什么?
P.S。请注意,我已尽力使示例尽可能简单,以免陷入具体细节。
答案 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运算符b
加c
因此,您只需致电a
隐含b
加c
答案 3 :(得分:2)
举个例子:
var person = GetRandomPerson();
string firstname = person.Select(a => a.FirstName);
我知道这在语法上很难。但在这种情况下,a
是person
变量。由于您可以在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运算符不返回任何内容,更像是“转到”或“使用”。