当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《你如何声明内联的谓词代表?》经验,为你挑选了3个好方法。

我正在使用C#.

所以我有一个有一些领域的对象,并不重要.我有这些对象的通用列表.

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

所以我想根据一些标准从列表中删除对象.例如,myObject.X >= 10. 我想使用该RemoveAll(Predicate match)方法来执行此操作.

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



1> Erik van Bra..:

有两个选项,一个显式委托或一个伪装成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构造:)



2> Mark Bracket..:

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#自2005年以来就已经拥有它.

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

要么

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

要么

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

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有