我一直在想弄清楚为什么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(); //?
答案 0 :(得分:8)
我会把它读作:
单独选择每个项目 将myList转换为变量s,使用s, 在它上面应用Trim()并完成 使用myList中的所有项目,转换 整个事情列表。
答案 1 :(得分:3)
我不会用英文阅读。这有点像说外语。一旦你真正得到它,你就不会用你的母语来回使用它。
虽然我可以将其翻译成英文,但这种尝试似乎破坏了未翻译代码的含义。 (即“将foo设置为myList中修剪值的列表。”)
答案 2 :(得分:2)
鉴于LINQ通常只适用于IEnumerable对象,您可以将s =>
读为“IEnumerable中的每个s”。
<强>更新强> 回顾5年来的这个答案,我对它非常不满意。就个人而言,现在我发现自己认为它是“地图”,或者我已经看到“这样”,这也取决于具体情况。
答案 3 :(得分:2)
类似于:
从myList修剪每个字符串&#34; s&#34;并将其放入新的列表
答案 4 :(得分:1)
对于myList中的每个String项,对项目执行
Trim()
,然后将结果作为列表返回。
请参阅Enumerable.Select
上的文件。它本质上是一个内置的foreach,能够在处理完结果后返回结果。
答案 5 :(得分:1)
前几次,您需要将完整的表达式分解为位并将它们转换为您熟悉的语法,最终您将熟悉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>
的扩展方法。
答案 6 :(得分:0)
我在学习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()
方法。