【问题标题】:Explain x => x.ToString() //simplify so many callsExplain x => x.ToString() //简化这么多的调用
【发布时间】:2010-09-14 11:36:04
【问题描述】:

question answer 中,我找到了以下编码提示:-

2) 带有一个参数的简单 lambda:

x => x.ToString() //simplify so many calls

作为一个还没有使用 3.0 的人,我不太了解这个技巧,但它看起来很有趣,所以我希望通过一些示例来详细说明它如何简化调用。

我研究了 lambda,所以我认为我知道它们的作用,但是我可能不完全理解,所以也可能一点解包井井有条。

【问题讨论】:

    标签: c# .net-3.5 lambda


    【解决方案1】:

    这基本上扩展为:

    private string Lambda(object x) {
      return x.ToString();
    }
    

    【讨论】:

    • 我就是这么想的。直接调用 ToString 有什么帮助?
    • 就其本身而言并非如此。这取决于您使用它的上下文。
    • David:假设您要将整数列表转换为字符串列表。您可以编写一个通用的转换例程,但它需要一个委托来应用于列表中的 每个 值 - 而 lambda 表达式可以更轻松地指定该委托。
    【解决方案2】:

    当您需要创建具有单个参数的委托实例时,lambda 表达式允许您以非常简洁的方式“内联”创建该委托。例如,下面是通过姓名在列表中查找特定人员的代码:

    List<Person> list = new List<Person>();
    // [..] Populate list here
    Person jon = list.Find(p => p.Name == "Jon");
    

    在 C# 2.0 中,您可以使用匿名方法,该方法有点冗长,但不会不好:

    List<Person> list = new List<Person>();
    // [..] Populate list here
    Person jon = list.Find(delegate(Person p) { return p.Name == "Jon"; });
    

    在 C# 1.0 中,您必须创建一个完整的额外方法。此外,如果你想参数化它,你必须创建一个不同的类型,而匿名方法和 lambda 表达式会捕获它们的执行环境(局部变量等),所以它们就像闭包一样:

    public Person FindByName(List<Person> list, String name)
    {
        return list.Find(p => p.Name == name); // The "name" variable is captured
    }
    

    my article about closures 有更多相关信息。

    虽然将委托传递给方法在 C# 2.0 和 .NET 2.0 中并不常见,但它是 LINQ 基础的很大一部分 - 因此您倾向于在带有 .NET 3.5 的 C# 3.0 中大量使用它。

    【讨论】:

      【解决方案3】:
      string delegate(TypeOfX x)
      {
        return x.ToString();
      }
      

      【讨论】:

        【解决方案4】:

        您熟悉 C# 2.0 匿名方法吗?这两个调用是等价的(假设 SomeMethod 接受委托等):

        SomeMethod(x => x.ToString());
        
        SomeMethod(delegate (SomeType x) { return x.ToString();});
        

        我知道我想输入哪个...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-02
          • 1970-01-01
          • 1970-01-01
          • 2016-03-28
          • 1970-01-01
          • 2013-12-13
          • 2016-06-11
          • 1970-01-01
          相关资源
          最近更新 更多