用lambda表达式替换委托

时间:2012-03-05 08:11:56

标签: c# delegates lambda

我正在尝试用lambda表达式替换以下语句:

 List<ABC> l = new List<ABC>();
  l.Find(delegate(ABC a) { return a.A == 4; });

我试过

 l.Find((ABC a)=>a.A==4;);

但这显然是不正确的。 感谢

4 个答案:

答案 0 :(得分:9)

要完成,任何这些都是有效的:

// Fullest version
l.Find((ABC a) => { return a.A==4; });

// Infer the type of the parameter
l.Find((a) => { return a.A==4; });

// Single parameter - can remove the ()
l.Find(a => { return a.A==4; });

// Single expression - can remove braces and semi-colon
l.Find(a => a.A == 4);

(您可以独立于其他快捷方式使用“单个表达式”部分。)

答案 1 :(得分:7)

首先,请注意仍然是委托 - 只是:它使用 lambda语法而不是匿名方法语法(它本质上意味着完全相同的东西,但是。)

至于如何修复它:只需带走;

l.Find((ABC a) => a.A == 4);

或更简单:

l.Find(a => a.A == 4);

(如果您有多个参数,则括号仅为必需;显式类型对于消除歧义非常有用)

答案 2 :(得分:4)

试试这个

l.Find( (a) => a.A == 4);

答案 3 :(得分:2)

为什么不以简单的方式使用它,我认为没有必要写(ABC a)

l.Find(a => a.A == 4);

此声明l.Find((a) => a.A == 4);可以写为您的声明l.Find(delegate(ABC a) { return a.A == 4; });。正如您所见,谓词可以用匿名方法(委托)替换。

(。NET 2.0)

 fooList.Find(delegate (Foo f) { return f.Equals(fooTarget); });

或(更高版本)

 fooList.Find(f => f.Equals(fooTarget));