7

问题答案中,我找到了以下编码提示:-

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

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

作为一个还没有使用过 3.0 的人,我并不真正理解这个技巧,但它看起来很有趣,所以我希望通过几个例子来说明它如何简化调用。

我研究了 lambdas,所以我我知道它们的作用,但是我可能不完全理解,所以也可能需要进行一点拆包。

4

4 回答 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 中大量使用它。

于 2008-10-01T09:16:35.310 回答
2

这基本上扩展为:

private string Lambda(object x) {
  return x.ToString();
}
于 2008-10-01T09:12:47.410 回答
1

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

SomeMethod(x => x.ToString());

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

我知道我宁愿输入哪个...

于 2008-10-01T09:18:12.700 回答
0
string delegate(TypeOfX x)
{
  return x.ToString();
}
于 2008-10-01T09:16:40.257 回答