我正在使用C#.
所以我有一个有一些领域的对象,并不重要.我有这些对象的通用列表.
ListmyObjects = new List (); myObjects.Add(myObject1); myObjects.Add(myObject2); myObjects.Add(myObject3);
所以我想根据一些标准从列表中删除对象.例如,myObject.X >= 10.
我想使用该RemoveAll(Predicate
方法来执行此操作.
我知道我可以定义一个可以传递给RemoveAll的委托,但我想知道如何使用匿名委托定义这个内联,而不是创建一堆仅在一次使用的委托函数.
有两个选项,一个显式委托或一个伪装成lamba结构的委托:
明确的代表
myObjects.RemoveAll(delegate (MyObject m) { return m.X >= 10; });
拉姆达
myObjects.RemoveAll(m => m.X >= 10);
加成:
性能明智都是平等的.事实上,两种语言结构在编译时都会生成相同的IL.这是因为C#3.0基本上是C#2.0的扩展,因此它编译为C#2.0构造:)
lambda C#3.0方式:
myObjects.RemoveAll(m => m.x >= 10);
匿名代表C#2.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);
要么
Predicatematches = delegate(Foo o){ return o.X >= 10; }); //or Predicate matches = o => o.X >= 10; RemoveAll(matches);