我正在使用C#。
所以我有一个有一些领域的对象,并不重要。 我有这些对象的通用列表。
List<MyObject> myObjects = new List<MyObject>();
myObjects.Add(myObject1);
myObjects.Add(myObject2);
myObjects.Add(myObject3);
所以我想根据一些标准从列表中删除对象。
例如,myObject.X >= 10.
我想使用RemoveAll(Predicate<T> match)
方法来执行此操作。
我知道我可以定义一个可以传递给RemoveAll的委托,但是我想知道如何使用匿名委托来内联,而不是创建一堆仅在一次使用的委托函数。 / p>
答案 0 :(得分:53)
有两个选项,一个显式委托或一个伪装成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构造:)
答案 1 :(得分:15)
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不支持匿名委托。
答案 2 :(得分:10)
//C# 2.0
RemoveAll(delegate(Foo o){ return o.X >= 10; });
或
//C# 3.0
RemoveAll(o => o.X >= 10);
或
Predicate<Foo> matches = delegate(Foo o){ return o.X >= 10; });
//or Predicate<Foo> matches = o => o.X >= 10;
RemoveAll(matches);
答案 3 :(得分:0)
Predicate是一个委托,它接受一个参数并返回一个布尔值。
我们可以通过以下方式做同样的事情
1)使用内联Lambda表达式
RemoveAll(p=> p.x > 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 o.X >= 20; });
RemoveAll(matches);
3)明确声明一个委托并指向一个函数
public delegate bool IsInValidEmployee (Employee emp);
IsInValidEmployee invalidEmployeeDelegate = new IsInValidEmployee(IsEmployeeInValid);
myObjects.RemoveAll(myObject=>invalidEmployeeDelegate(myObject);
//实际功能
public static bool IsEmployeeInValid(Employee emp)
{
if (emp.Id > 0 )
return true;
else
return false;
}