代码之家  ›  专栏  ›  技术社区  ›  John V

我可以用标准委托代替谓词吗?

  •  3
  • John V  · 技术社区  · 6 年前

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

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

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

    一、 e.创建委托,将其设置为方法a,然后将委托实例作为谓词传递。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Tewr    6 年前

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