在question answer中,我找到以下编码提示: -
2)带有一个参数的简单lambda:
x => x.ToString() //simplify so many calls
作为一个尚未使用3.0的人,我并不真正理解这个提示,但它看起来很有趣,所以我希望通过一些例子来简化这种简化调用的方法。
我研究过lambdas所以我认为我知道他们做了什么,但我可能不完全理解所以小拆包也可能按顺序。
答案 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();
}