解释 x => x.ToString() //简化多次调用

7
在一个问题回答中,我发现了以下编码技巧:
2)只有一个参数的简单lambda表达式:
x => x.ToString() //simplify so many calls

作为一个尚未使用3.0的人,我并不真正理解这个提示,但它看起来很有趣,所以我希望能够详细说明如何通过一些示例简化调用。
我已经研究了lambda表达式,所以我认为我知道它们的作用,但是我可能还没有完全理解,因此可能需要进一步解释。
4个回答

21

当你需要创建一个只有一个参数的委托实例时,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
}

关于这个问题,我的闭包文章中有更多相关内容。

虽然在C# 2.0和.NET 2.0中将委托传递到方法中并不常见,但它是LINQ的基础之一 - 因此在C#3.0和.NET 3.5中经常使用它。


2
这基本上扩展为:
private string Lambda(object x) {
  return x.ToString();
}

这正是我所想的。与直接调用 ToString 相比,它有什么帮助? - David Max
它本身并不能做任何事情。它取决于您在使用它时的上下文。 - Christian.K
David:假设你想将一个整数列表转换为字符串列表。你可以编写一个通用的转换程序,但它需要一个委托来应用于列表中的每个值 - 而lambda表达式使得指定该委托更容易。 - Jon Skeet

1
你熟悉 C# 2.0 的匿名方法吗?这两个调用是等效的(假设 SomeMethod 接受委托等):
SomeMethod(x => x.ToString());

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

我知道我更愿意打...


0
string delegate(TypeOfX x)
{
  return x.ToString();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接