使用谓词而不是普通委托是否有任何价值?以下面的例子为例,我没有看到任何内容。
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");
答案 0 :(得分:5)
他们实际上是一样的。 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 :(得分:0)
Predicate是一名代表。它是.Net framework 3.0中定义的委托。谓词总是返回一个布尔值。因此,代码中的两个代表都是等效的。 .Net提供的其他代表是Func和Action。操作返回void。
答案 2 :(得分:0)
只有一堆Microsoft提供的库代码才能使用它。
例如:List.FindAll
需要传递Predicate
。
对于您自己的代码,您可以使用自己喜欢的代码。你甚至可以使用Converter<int, bool>
。
答案 3 :(得分:0)
他们实际上是一样的。也就是说,扩展方法(在您的个人图书馆或其他人的网站上)更有可能在Func<T, TResult>
上定义,所以我更喜欢那个。
答案 4 :(得分:0)
为了与LINQ保持一致,我倾向于在Func<T, bool>
上定义Predicate<T>
。