【问题标题】:Advantage of Predicate<T> over Func<T,bool>?Predicate<T> 优于 Func<T,bool>?
【发布时间】:2011-01-04 03:54:48
【问题描述】:

在普通委托上使用谓词有什么价值吗?以下面的示例为例,我没有看到任何内容。

Predicate<int> isEven = delegate(int x) { return x % 2 == 0; };
Console.WriteLine(isEven(1) + "\r\r");

Func<int, bool> isEven2 = delegate(int x) { return x % 2 == 0; };
Console.WriteLine(isEven(1) + "\r\r");

【问题讨论】:

标签: c# .net delegates


【解决方案1】:

它们实际上是相同的。 Predicate&lt;T&gt; 是一种委托类型,已添加到列表和数组 Find() 方法的基类库中。这是在 LINQ 之前,当时引入了更通用的 Func 代表家族。你甚至可以编写自己的委托类型并使用它:

delegate bool IntPredicate(int x); 

static void Main()
{
   IntPredicate isEven = delegate(int x) {return x % 2 == 0;};
   Console.WriteLine(isEven(1) + "\r\r");
}

【讨论】:

  • +1,虽然我也经常在看起来很丑(但很笼统)的Func&lt;T,bool&gt; 和更好看的Predicate&lt;T&gt; 之间纠结。特别是考虑到 Func 没有说明它的预期用途,而 Predicate sorta 确实如此。
  • 我几乎不需要指定委托类型,因为我只是将它们作为类型推断的 lambda 输入,例如,foo( x =&gt; x % 2 == 0);
  • 使用Predicate&lt;T&gt;,委托的预期用途更加明确。再说一次,如果你很好地命名参数,差异可能可以忽略不计。例如。 public SomeObj Find(Func&lt;SomeObj, bool&gt; isMatch) { }public SomeObj Find(Predicate&lt;SomeObj&gt; isMatch) { }.
【解决方案2】:

谓词是一个委托。它是.Net framework 3.0 中定义的委托。谓词总是返回一个布尔值。因此,您的代码中的两个代表都是等效的。 .Net 提供的其他代表是 Func 和 Action。动作返回无效。

【讨论】:

  • 其实从.NET 2.0开始就可以使用了
【解决方案3】:

只有一堆微软提供的库代码使用它。

例如:List.FindAll 需要传递一个Predicate

对于您自己的代码,您可以使用任何您喜欢的代码。你甚至可以使用Converter&lt;int, bool&gt;

【讨论】:

    【解决方案4】:

    它们实际上是相同的。也就是说,扩展方法(在您的个人库或其他人的库中)更有可能在 Func&lt;T, TResult&gt; 上定义,所以我更喜欢那个。

    【讨论】:

      【解决方案5】:

      为了与 LINQ 保持一致,我倾向于定义 Func&lt;T, bool&gt; 而不是 Predicate&lt;T&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-05
        • 2010-10-18
        • 1970-01-01
        • 1970-01-01
        • 2010-10-14
        • 1970-01-01
        相关资源
        最近更新 更多