【问题标题】:Can you explain lambda expressions? [duplicate]你能解释一下 lambda 表达式吗? [复制]
【发布时间】:2010-09-16 06:56:59
【问题描述】:

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

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

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

【问题讨论】:

标签: delegates lambda closures imperative-languages


【解决方案1】:

基本上就 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 对此进行了更全面的讨论 - 以及其他方面。

【讨论】:

  • 我看到了这个问题,我想,“哦!也许我可以击败 Jon Skeet!”但后来我没有。 :) +1
  • 该代码看起来相当不错,尽管我正在考虑 Select 是否是正确的名称。如果您使用 Map,您将在代码中得到关系代数。 :)
  • 对我来说,Map 建议创建一个从键到值的映射,您可以在其中按键查找。我个人更喜欢 Project()。
  • 今年早些时候在 Lippert 的博客上进行了一个简短的、切线相关的讨论,关于阅读“=>”运算符:blogs.msdn.com/ericlippert/archive/2008/05/16/…
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    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 只是一种避免创建新函数的语法开销的方法。

    【讨论】:

    • 您的最终评论不一定正确。 lambda 还提供了在变量上创建闭包的能力。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2020-12-23
          • 1970-01-01
          • 2011-09-22
          • 2019-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-02
          相关资源
          最近更新 更多