24

我并没有真正得到lambda 表达式。虽然它们从 ALGOL 时代就已经存在,但直到最近 Python 和 Ruby 变得非常流行时,我才开始听说它们。现在 C# 有了=>语法,我的世界 (.NET) 中的人们越来越多地谈论 lamdba 表达式。

我已阅读有关 lambda 演算的 Wikipedia 文章,但我并不是真正的数学专家。从实际的角度来看,我并没有真正理解它。我什么时候使用 lambda 表达式?为什么?我怎么知道这是我应该做的?

您能否以前后格式展示如何解决 lambda 表达式问题的示例?任何命令式语言都可以,但 C# 对我来说最容易理解。

4

6 回答 6

22

基本上就 C# 而言,lambda 表达式是一种创建委托(或表达式树,但我们暂时将其放在一边)的简单方法。

在 C# 1 中,我们只能从普通方法创建委托实例。在 C# 2 中,我们获得了匿名方法。在 C# 3 中,我们获得了 lambda 表达式,它类似于更简洁的匿名方法。

当你想表达一些接受一个值并返回一个值的逻辑时,它们特别简洁。例如,在 LINQ 的上下文中:

                       // Only include children - a predicate
var query = dataSource.Where(person => person.Age < 18) 
                       // Transform to sequence of names - a projection
                      .Select(person => person.Name);

在我关于闭包的文章中对此进行了更全面的讨论 - 以及其他方面。

于 2008-10-09T14:08:38.893 回答
3

这个问题的答案可能对你有用。

于 2008-10-09T14:06:57.117 回答
2

lambda 函数只是匿名函数。

例如,在 python 中,您希望将列表中的所有元素加倍。几乎有三种方法可以做到这一点:

列表表达式:

[2*x for x in list]

显式功能:

def double(x):
    return 2*x
map(double, list) # iirc

使用 lambda:

double = lambda x : 2*x
map(double, list)

因此,大多数语言中的 lambda 只是一种避免创建新函数的语法开销的方法。

于 2008-10-09T14:11:19.293 回答
1

这是我见过的关于如何理解在 C# 中使用 lambda 表达式的重要思想的更好解释之一:

http://www.developingfor.net/c-30/upgrade-your-c-skills-part-3-lambda-expressions.html

于 2008-10-09T14:11:55.437 回答
0

我在 .NET 中主要使用 lambda 表达式是在处理列表时。使用 lambda 表达式,您可以像构建 SQL 语句来搜索数据库表一样,在列表上构建查询。

于 2008-10-09T14:09:31.730 回答
0

lambda 表达式是一个函数值(与“int”和“string”是值的意义相同)。这意味着可以

  • 定义一个包含 lambda 表达式的变量(这与定义函数相同)
  • 从方法或函数返回 lambda 表达式
  • 将 lambda 表达式作为参数发送给函数或方法

看一下 map、filter 或 fold(在任何函数式语言中)之类的函数,以了解 lambda 表达式如何用作其他函数的参数。

于 2008-10-09T14:18:20.073 回答