你能解释一下lambda表达式吗?

时间:2008-10-09 14:05:06

标签: delegates lambda closures imperative-languages

我并不是获取 lambda表达式。虽然他们自ALGOL时代就已存在,但直到最近,当Python和Ruby变得非常受欢迎时,我才开始听到它们。既然C#具有=>语法,那么我的世界(.NET)中的人们越来越多地讨论lamdba表达式。

我已经读过关于lambda演算的维基百科文章,但我不是一个真正的数学家。从实际角度来看,我并不是真的理解它。我什么时候会使用lambda表达式?为什么?我怎么知道这是我应该做的?

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

6 个答案:

答案 0 :(得分:21)

基本上就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);

my article on closures中,对此进行了更全面的讨论 - 以及其他方面。

答案 1 :(得分:3)

this question的答案可能对您有用。

答案 2 :(得分:2)

lambda函数只是匿名函数。

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

列表表达式:

[2*x for x in list]

显式功能:

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

与lambdas:

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

我在.NET中使用lambda表达式的主要用途是使用列表。使用lambda表达式,您可以使用与构建SQL语句来搜索数据库表的方式类似的方式在列表上构建查询。

答案 5 :(得分:0)

lambda表达式是一个功能值(同样意义上'int'和'string'是值)。这意味着可以

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

查看map,filter或fold(用任何函数语言)等函数来查看lambda表达式如何用作其他函数的参数。