你如何声明一个谓词委托内联?
我正在使用C#。
所以我有一个有一些领域的对象,其实并不重要。 我有这些对象的通用列表。
List<MyObject> myObjects = new List<MyObject>(); myObjects.Add(myObject1); myObjects.Add(myObject2); myObjects.Add(myObject3);
所以我想根据一些标准从我的列表中删除对象。 例如, myObject.X >= 10.
我想使用RemoveAll(Predicate<T> match)
方法来做到这一点。
我知道我可以定义一个可以传递给RemoveAll的委托,但是我想知道如何用匿名委托内联定义这个委托,而不是创build一堆仅用于一次的委托函数。
有两个选项,一个显式委托或伪装成lamba构造的委托:
明确的委托
myObjects.RemoveAll(delegate (MyObject m) { return mX >= 10; });
拉姆达
myObjects.RemoveAll(m => mX >= 10);
加成:
性能上都是平等的。 事实上,两种语言结构在编译时都会生成相同的IL。 这是因为C#3.0基本上是C#2.0的扩展,所以它编译为C#2.0构造:)
lambda C#3.0方式:
myObjects.RemoveAll(m => mx >= 10);
匿名代理C#2.0方式:
myObjects.RemoveAll(delegate (MyObject m) { return mx >= 10; });
而且,对于VB的人,VB 9.0的lambda方式:
myObjects.RemoveAll(Function(m) mx >= 10)
不幸的是,VB不支持匿名代理。
//C# 2.0 RemoveAll(delegate(Foo o){ return oX >= 10; });
要么
//C# 3.0 RemoveAll(o => oX >= 10);
要么
Predicate<Foo> matches = delegate(Foo o){ return oX >= 10; }); //or Predicate<Foo> matches = o => oX >= 10; RemoveAll(matches);
谓词是一个代表,它接受一个参数并返回一个布尔值。
我们可以按照以下方式做同样的事情
1) 使用内联Lambdaexpression式
RemoveAll(p=> px > 2);
2) 使用匿名函数
RemoveAll(delegate(myObject obj){ return obj.x >=10; })
3) 使用谓词委托
Predicate<myObject> matches = new Predicate<myObject>(IsEmployeeIsValid); RemoveAll(matches); Predicate<Foo> matches = delegate(Foo o){ return oX >= 20; }); RemoveAll(matches);
3) 明确声明一个委托并指向一个函数
public delegate bool IsInValidEmployee (Employee emp); IsInValidEmployee invalidEmployeeDelegate = new IsInValidEmployee(IsEmployeeInValid); myObjects.RemoveAll(myObject=>invalidEmployeeDelegate(myObject);
//实际function
public static bool IsEmployeeInValid(Employee emp) { if (emp.Id > 0 ) return true; else return false; }