你怎么读lambda表达式?

时间:2011-06-20 14:53:49

标签: c# .net lambda

我一直在想弄清楚为什么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(); //?

7 个答案:

答案 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()方法。