C# 如何内联声明谓词委托?
所以我有一个对象,它有一些字段,实际上并不重要。 我有这些对象的通用列表C# 如何内联声明谓词委托?,c#,delegates,C#,Delegates,所以我有一个对象,它有一些字段,实际上并不重要。 我有这些对象的通用列表 List<MyObject> myObjects = new List<MyObject>(); myObjects.Add(myObject1); myObjects.Add(myObject2); myObjects.Add(myObject3); List myObjects=new List(); myObjects.Add(myObject1); myObjects.Add(myObje
List<MyObject> myObjects = new List<MyObject>();
myObjects.Add(myObject1);
myObjects.Add(myObject2);
myObjects.Add(myObject3);
List myObjects=new List();
myObjects.Add(myObject1);
myObjects.Add(myObject2);
myObjects.Add(myObject3);
因此,我想根据一些条件从列表中删除对象。
例如,myObject.X>=10。
我想使用的RemoveAll(谓词匹配)
方法来实现这一点
我知道我可以定义一个可以传递到RemoveAll的委托,但我想知道如何用匿名委托内联定义此委托,而不是创建一组只在一个位置使用的委托函数。有两个选项,显式委托或伪装为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结构lambda C#3.0方式: 匿名委托C#2.0方式: 对于VB的人来说,VB 9.0 lambda方式:
myObjects.RemoveAll(Function(m) m.x >= 10)
不幸的是,VB不支持匿名委托
//C# 2.0
RemoveAll(delegate(Foo o){ return o.X >= 10; });
或
或
谓词匹配=委托(fooo){returno.X>=10;});
//or谓词匹配=o=>o.X>=10;
移除所有(匹配项);
谓词是接受参数并返回布尔值的委托
我们可以通过以下方式做同样的事情
1) 使用内嵌Lambda表达式
RemoveAll(p=> p.x > 2);
RemoveAll(delegate(myObject obj){
return obj.x >=10;
})
public delegate bool IsInValidEmployee (Employee emp);
IsInValidEmployee invalidEmployeeDelegate = new IsInValidEmployee(IsEmployeeInValid);
myObjects.RemoveAll(myObject=>invalidEmployeeDelegate(myObject);
2) 使用匿名函数
RemoveAll(p=> p.x > 2);
RemoveAll(delegate(myObject obj){
return obj.x >=10;
})
public delegate bool IsInValidEmployee (Employee emp);
IsInValidEmployee invalidEmployeeDelegate = new IsInValidEmployee(IsEmployeeInValid);
myObjects.RemoveAll(myObject=>invalidEmployeeDelegate(myObject);
3) 使用谓词委托
Predicate<myObject> matches = new Predicate<myObject>(IsEmployeeIsValid);
RemoveAll(matches);
Predicate<Foo> matches = delegate(Foo o){ return o.X >= 20; });
RemoveAll(matches);
//实际功能
public static bool IsEmployeeInValid(Employee emp)
{
if (emp.Id > 0 )
return true;
else
return false;
}
VB有lambdas时为什么需要匿名委托?是的,下一个版本将有多行lambda和不返回值的lambda(
Sub
s)。因为您刚才提到的原因-多行语句和不返回值的函数。很高兴知道它将出现在下一个版本中,但C#从2005年就开始使用它了。
public static bool IsEmployeeInValid(Employee emp)
{
if (emp.Id > 0 )
return true;
else
return false;
}