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