【问题标题】:Can I use a standard delegate instead a predicate?我可以使用标准委托而不是谓词吗?
【发布时间】:2018-08-13 08:38:12
【问题描述】:

我知道我可以使用匿名方法或 lambda 表达式,例如:

myObjects.RemoveAll(delegate (MyObject m) { return m.X >= 10); });


myObjects.RemoveAll(m => m.X >= 10));

但我不知道是否可以使用常规委托(委托 bool X (MyObject o) ),我的尝试失败了。

即创建一个委托,将其设置为一个方法,然后将委托实例作为谓词传递。

【问题讨论】:

  • 这不起作用,但如果需要,您可以使用 lambda 调用委托:myObjects.RemoveAll(x => myDelegate(x));(其中 myDelegate 是委托)。

标签: c# delegates predicate


【解决方案1】:

出于兼容性原因,您必须显式实例化委托,即使不同委托的签名是兼容的。这没有很好的记录,请参阅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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多