【问题标题】:Is Predicate<T> not available in .NET 3.0+Predicate<T> 在 .NET 3.0+ 中不可用吗
【发布时间】:2010-11-27 22:44:15
【问题描述】:

Predicate 在 .NET 中的任何地方都可用吗?从 MSDN http://msdn.microsoft.com/en-us/library/bfcke1bz.aspx,我在任何地方都看不到谓词。我看到一个匿名返回布尔值但没有泛型或“谓词”关键字。

【问题讨论】:

    标签: .net generics .net-3.5 predicate


    【解决方案1】:

    That page on MSDN 是关于 Predicate(T) 委托的,正如它所说:

    表示定义一个方法 一组标准并确定是否 指定的对象满足那些 标准。

    【讨论】:

      【解决方案2】:

      PredicateSystem 命名空间中的类型(更具体地说,是委托类型)。这不是关键字。

      【讨论】:

      • 如果是类型,那为什么例子中不用 Predicate 呢?有没有使用它的例子?什么是委托类型而不是类型?
      【解决方案3】:

      肯定是在 3.0 中...请参阅该 MSDN 页面的底部:

      版本信息

      .NET 框架

      支持: 3.5、3.0、2.0

      只要您在“使用系统”,您就应该看到它。

      【讨论】:

        【解决方案4】:

        谓词 Type 在 3.5 和 4.0 中都有。

        【讨论】:

          【解决方案5】:

          您可以将其用作类型然后将其传入,而不是内联谓词的委托。这是一个示例:

          var list = new List<int>();
          list.AddRange(Enumerable.Range(1, 10));
          Predicate<int> p = delegate(int i)
                             {
                                return i < 5;
                             };
          list.RemoveAll(p);
          list.ForEach(i => Console.WriteLine(i));
          

          编辑:要使用现有方法声明谓词,您将使用:

          Predicate<int> p = IsLessThanFive;
          
          public bool IsLessThanFive(int number)
          {
              return number < 5;
          }
          

          更常见的替代方案是:

          list.RemoveAll(delegate(int i) { return i < 5; });
          // or...
          list.RemoveAll(i => i < 5);
          

          编辑:要在对另一篇文章的评论中回答您的其他问题,委托是一种定义方法签名的类型,可用于将方法作为参数传递给其他方法。如果您对 C++ 有点熟悉,它们就像函数指针。有关代表的更多信息,请查看this MSDN page

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-14
            • 1970-01-01
            • 2011-03-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多