你如何阅读 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(); //?

你如何阅读 lambda 表达式

我会把它读成:

从中单独选择每个项目 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()方法。