我们如何声明内联谓词?
时间: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 <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);