我可以使用标准委托而不是谓词吗?
Can I use a standard delegate instead a predicate?
我知道我可以使用匿名方法或 lambda 表达式,例如:
myObjects.RemoveAll(delegate (MyObject m) { return m.X >= 10); });
myObjects.RemoveAll(m => m.X >= 10));
但我不知道是否可以使用常规委托 (delegate bool X (MyObject o) ),我的尝试失败了。
即创建委托,将其设置为方法 a,然后将委托实例作为谓词传递。
出于兼容性原因,您必须显式实例化委托,即使不同委托的签名是兼容的。这没有很好的记录,请参阅 this question.
中的讨论
(非常冗长的)语法示例:
public void Test()
{
var l = new List<MyObject>();
// The following three lines
var x = new X(my => string.IsNullOrEmpty(my.Name));
var p = new Predicate<MyObject>(x);
l.RemoveAll(p);
// ...will accomplish the same as:
l.RemoveAll(my => string.IsNullOrEmpty(my.Name));
}
private delegate bool X(MyObject m);
private class MyObject
{
public string Name { get; set; }
}
我知道我可以使用匿名方法或 lambda 表达式,例如:
myObjects.RemoveAll(delegate (MyObject m) { return m.X >= 10); });
myObjects.RemoveAll(m => m.X >= 10));
但我不知道是否可以使用常规委托 (delegate bool X (MyObject o) ),我的尝试失败了。
即创建委托,将其设置为方法 a,然后将委托实例作为谓词传递。
出于兼容性原因,您必须显式实例化委托,即使不同委托的签名是兼容的。这没有很好的记录,请参阅 this question.
中的讨论(非常冗长的)语法示例:
public void Test()
{
var l = new List<MyObject>();
// The following three lines
var x = new X(my => string.IsNullOrEmpty(my.Name));
var p = new Predicate<MyObject>(x);
l.RemoveAll(p);
// ...will accomplish the same as:
l.RemoveAll(my => string.IsNullOrEmpty(my.Name));
}
private delegate bool X(MyObject m);
private class MyObject
{
public string Name { get; set; }
}