你如何阅读 lambda 表达式
本文关键字:表达式 lambda 何阅读 | 更新日期: 2023-09-27 17:59:31
我一直在试图弄清楚为什么lambda表达式对我来说还不直观。我怀疑部分原因可能是因为当我浏览代码时,为了我自己的清晰度,我有时会在内部将其翻译成我的母语。例如:
endDate.Value = someNullableDate ?? (object)DBNull.Value;
// I could read as:
set endDate to someNullableDate or, if null, to (object)dbNull
另一种语言的示例:
for(int count = 0; count >= 42; count++) {
cout << "Count is " << count << endl;
}
// May read as:
from an integer "count" as zero to 42 inclusive, display "Count is " and then the integer.
那么如何解读lambda表达式:
var myList = new List<String>(/* various string values */);
var foo = myList.Select(s => s.Trim()).ToList(); //?
我会把它读成:
从中单独选择每个项目 myList 成一个变量 s,使用 s, 在其上应用 Trim(( 并完成后 与 myList 中的所有项目一起,将 整个事情到一个列表。
鉴于 LINQ 通常只适用于 IEnumerable 对象,您可以将s =>
读作"for the IEnumerable 中的每个 s"。
更新:5年多过去了,我重新审视这个答案,我对此深感不满。就个人而言,现在我发现自己将其视为"映射到",或者我已经看到"这样",这也取决于情况。
前几次,您需要将完整表达式分解为位并将它们转换为您熟悉的语法,最终您将熟悉 lambda。
在此代码段中,
var foo = myList.Select(s => s.Trim()).ToList();
Select()
执行类似于 SQL 中的投影操作。
s => s.Trim()
可以转换为
string SomeMethod(string input)
{
return input.Trim();
}
最后一个ToList()
是将IEnumerable<T>
转换为List<T>
的扩展方法。
我不读英文。 这有点像说外语。 一旦你真正理解了它,你就不会来回使用你的母语来使用它。
虽然我可以把它翻译成英文,但这种尝试似乎破坏了未翻译代码的含义。 (即"将foo设置为myList中修剪值的列表。
大致如下的内容:
从 myList 中,修剪每个字符串"s"并将其放入新列表中
对于 myList 中的每个字符串项,对该项执行
Trim()
,然后将结果作为列表返回。
请参阅Enumerable.Select
上的文档。它本质上是一个内置的foreach,能够在处理后返回结果。
学习 C# 时写了最初的问题,现在发现 LINQ 非常直观。
我阅读了我的原始代码:
var foo = myList.Select(s => s.Trim()).ToList(); //?
如:
For each string "s" in myList, trim "s", then ToList() the results.
今天,我不会将 LINQ 用于此任务。从根本上说,它是一种查询语言(LINQ 中的 Q(,不一定是修改列表的最有效选择。如果我仍然选择 LINQ,我会使用它.ForEach()
方法。