解释x => x.ToString()//简化了这么多的调用

时间:2008-10-01 09:11:00

标签: c# .net-3.5 lambda

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

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

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

作为一个尚未使用3.0的人,我并不真正理解这个提示,但它看起来很有趣,所以我希望通过一些例子来简化这种简化调用的方法。

我研究过lambdas所以我认为我知道他们做了什么,但我可能不完全理解所以拆包也可能按顺序。

4 个答案:

答案 0 :(得分: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
}

my article about closures中有更多相关内容。

虽然将代理传递给方法在C#2.0和.NET 2.0中并不常见,但它是LINQ基础的很大一部分 - 所以你倾向于在.NET 3.5的C#3.0中大量使用它。

答案 1 :(得分:2)

这基本上扩展为:

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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

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