2008-10-09 41 views
22

我真的没有得到 lambda表达式。从ALGOL时代开始,他们就已经出现了,直到最近,当Python和Ruby变得非常流行时,我才开始听说它们。既然C#具有=>语法,我的世界中的人(.NET)越来越多地谈论lamdba表达式。你能解释lambda表达式吗?

我已阅读关于lambda微积分的维基百科文章,但我不是一个真正的数学家伙。我从实际的角度不太明白这一点。我什么时候可以使用lambda表达式?为什么?我怎么知道这是我应该做的?

你能举例说明如何用lambda表达式解决前后格式的问题吗?任何命令式语言都很好,但C#对我来说是最容易理解的。

+1

重复 http://stackoverflow.com/questions/167343/c-lambda-expression-why-should-i-use-this http://stackoverflow.com/questions/150129/what-is-a -lambda – jop 2008-10-09 14:13:43

+0

谢谢,我阅读了这些链接,但他们没有回答我的问题。我的问题是关于这种特定技术如何有用以及如何确定这种使用的例子,更具体一点。 – 2008-10-09 14:18:03

回答

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 - 与其他方面一起。

+0

我看到了这个问题,我想,“噢!也许我可以击败Jon Skeet!”但后来我没有。 :) +1 – 2008-10-09 14:12:31

0

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

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) 

所以,在拉姆达大多数语言只是一种避免创建新函数的语法开销的方法。

0

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

  • 限定保持lambda表达式的变量(在此是相同的定义的函数)
  • 返回lambda表达式从方法或函数
  • 发送lambda表达式作为函数或方法的参数

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