你如何声明一个谓词委托内联?

我正在使用C#。

所以我有一个有一些领域的对象,其实并不重要。 我有这些对象的通用列表。

List<MyObject> myObjects = new List<MyObject>(); myObjects.Add(myObject1); myObjects.Add(myObject2); myObjects.Add(myObject3); 

所以我想根据一些标准从我的列表中删除对象。 例如, myObject.X >= 10.我想使用RemoveAll(Predicate<T> match)方法来做到这一点。

我知道我可以定义一个可以传递给RemoveAll的委托,但是我想知道如何用匿名委托内联定义这个委托,而不是创build一堆仅用于一次的委托函数。

有两个选项,一个显式委托或伪装成lamba构造的委托:

明确的委托

 myObjects.RemoveAll(delegate (MyObject m) { return mX >= 10; }); 

拉姆达

 myObjects.RemoveAll(m => mX >= 10); 

加成:

性能上都是平等的。 事实上,两种语言结构在编译时都会生成相同的IL。 这是因为C#3.0基本上是C#2.0的扩展,所以它编译为C#2.0构造:)

lambda C#3.0方式:

 myObjects.RemoveAll(m => mx >= 10); 

匿名代理C#2.0方式:

 myObjects.RemoveAll(delegate (MyObject m) { return mx >= 10; }); 

而且,对于VB的人,VB 9.0的lambda方式:

 myObjects.RemoveAll(Function(m) mx >= 10) 

不幸的是,VB不支持匿名代理。

  //C# 2.0 RemoveAll(delegate(Foo o){ return oX >= 10; }); 

要么

  //C# 3.0 RemoveAll(o => oX >= 10); 

要么

  Predicate<Foo> matches = delegate(Foo o){ return oX >= 10; }); //or Predicate<Foo> matches = o => oX >= 10; RemoveAll(matches); 

谓词是一个代表,它接受一个参数并返回一个布尔值。

我们可以按照以下方式做同样的事情

1) 使用内联Lambdaexpression式

 RemoveAll(p=> px > 2); 

2) 使用匿名函数

 RemoveAll(delegate(myObject obj){ return obj.x >=10; }) 

3) 使用谓词委托

 Predicate<myObject> matches = new Predicate<myObject>(IsEmployeeIsValid); RemoveAll(matches); Predicate<Foo> matches = delegate(Foo o){ return oX >= 20; }); RemoveAll(matches); 

3) 明确声明一个委托并指向一个函数

 public delegate bool IsInValidEmployee (Employee emp); IsInValidEmployee invalidEmployeeDelegate = new IsInValidEmployee(IsEmployeeInValid); myObjects.RemoveAll(myObject=>invalidEmployeeDelegate(myObject); 

//实际function

 public static bool IsEmployeeInValid(Employee emp) { if (emp.Id > 0 ) return true; else return false; }