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

时间:2020-03-06 14:58:05  来源:igfitidea点击:

在一个问题答案中,我发现以下编码提示:

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

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

作为尚未使用3.0的人,我不太了解此技巧,但它看起来很有趣,因此我希望通过列举一些例子来说明如何简化调用,这一点我将不胜感激。

我已经研究过lambda,所以我想我知道它们的作用,但是我可能还不完全了解,因此也可能需要进行一些拆包。

解决方案

这基本上扩展为:

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

当我们需要创建具有单个参数的委托的实例时,可以使用lambda表达式以非常简洁的方式"内联"创建该委托。例如,下面的代码可根据姓名在列表中查找特定的人:

List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(p => p.Name == "Jon");

在C2.0中,我们可以使用一个更冗长的匿名方法,但还不算太糟:

List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(delegate(Person p) { return p.Name == "Jon"; });

在C1.0中,我们必须创建一个完整的额外方法。此外,如果要对其进行参数化,则必须创建其他类型,而匿名方法和lambda表达式会捕获其执行环境(局部变量等),因此它们的作用类似于闭包:

public Person FindByName(List<Person> list, String name)
{
    return list.Find(p => p.Name == name); // The "name" variable is captured
}

在我有关闭包的文章中,有更多关于此的内容。

尽管将委托传递给方法在C2.0和.NET 2.0中并不普遍,但它是LINQ基础的很大一部分,因此我们倾向于在带有.NET 3.5的C3.0中大量使用它。

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

我们熟悉C2.0匿名方法吗?这两个调用是等效的(假设SomeMethod接受委托等):

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

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

我知道我想输入...