在问题答案中,我找到了以下编码提示:-
2) 带有一个参数的简单 lambda:
x => x.ToString() //simplify so many calls
作为一个还没有使用过 3.0 的人,我并不真正理解这个技巧,但它看起来很有趣,所以我希望通过几个例子来说明它如何简化调用。
我研究了 lambdas,所以我想我知道它们的作用,但是我可能不完全理解,所以也可能需要进行一点拆包。
当您需要创建具有单个参数的委托实例时,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 中大量使用它。
这基本上扩展为:
private string Lambda(object x) {
return x.ToString();
}
您熟悉 C# 2.0 匿名方法吗?这两个调用是等价的(假设 SomeMethod 接受委托等):
SomeMethod(x => x.ToString());
SomeMethod(delegate (SomeType x) { return x.ToString();});
我知道我宁愿输入哪个...
string delegate(TypeOfX x)
{
return x.ToString();
}