我们如何声明内联谓词?

时间:2020-03-05 18:52:16  来源:igfitidea点击:

我正在使用C#。

因此,我有一个包含一些字段的对象,实际上无关紧要。
我有这些对象的通用列表。

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

因此,我想根据某些条件从列表中删除对象。
例如," myObject.X> = 10"。
我想使用RemoveAll(Predicate &lt;T> match)方法来做到这一点。

我知道我可以定义一个可以传递给RemoveAll的委托,但是我想知道如何使用一个匿名委托来定义此内联,而不是创建一堆只能在一次使用的委托函数。

解决方案

回答

有两种选择,显式委托或者伪装成lamba构造的委托:

显式委托

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

拉姆达

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

添加:

明智的表现是平等的。实际上,两种语言构造在编译时都会生成相同的IL。这是因为C3.0本质上是对C2.0的扩展,因此它可以编译为C2.0构造:)

回答

Lambda C3.0方式:

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

匿名委托C2.0的方式:

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

而且,对于VB家伙来说,VB 9.0 lambda方法是:

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

不幸的是,VB不支持匿名委托。

回答

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

或者

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

或者

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