Predicate<T>相对于Func<T,bool>的优势是什么?

5

使用谓词而不是普通委托是否有价值?就下面的例子而言,我没有看到任何区别。

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");

1
难道不是相反的吗?相关:https://dev59.com/83RB5IYBdhLWcg3wUFnB - naveen
5个回答

7

它们实际上是相同的。 Predicate<T> 是一个委托类型,被添加到基类库中用于列表和数组的 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<T,bool>е’ҢжӣҙеҘҪзңӢзҡ„Predicate<T>д№Ӣй—ҙзҠ№иұ«дёҚеҶігҖӮзү№еҲ«жҳҜиҖғиҷ‘еҲ°Func并没жңүиҜҙжҳҺе…¶йў„жңҹз”ЁйҖ”пјҢиҖҢPredicateеҲҷжңүзӮ№иҜҙжҳҺдәҶгҖӮ - Josh
我几乎从不必须指定委托类型,因为我只需将它们输入为类型推断的lambda表达式,例如foo(x => x % 2 == 0); - Mark Cidade
使用 Predicate<T>,委托的预期用途更加明确。然而,如果您在命名参数方面做得很好,则差异可能是微不足道的。例如:public SomeObj Find(Func<SomeObj, bool> isMatch) { }public SomeObj Find(Predicate<SomeObj> isMatch) { } - Merlyn Morgan-Graham

0

为了与LINQ保持一致,我倾向于定义Func<T, bool>而不是Predicate<T>


0

Predicate是一个委托。它是在.Net框架3.0中定义的委托。Predicate始终返回布尔值。因此,您代码中的两个委托是等效的。.Net提供的其他委托包括Func和Action。Action返回void。


1
实际上,它从.NET 2.0开始就可用了。 - Ben Voigt

0

只是微软提供的许多库代码使用它。

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

对于您自己的代码,您可以使用任何一个。您甚至可以使用 Converter<int, bool>


0

它们实际上是相同的。也就是说,扩展方法(在您自己的库或他人的库中)更有可能定义在 Func<T, TResult> 上,因此我更喜欢它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接