你如何声明内联的谓词代表?

Cur*_*tis 41 c# delegates

我正在使用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不支持匿名委托.

  • 由于您刚才声明的原因 - 多行语句和不返回值的函数.很高兴知道它将在下一个版本中,但C#自2005年以来就已经拥有它. (2认同)

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)