Преимущество предиката <T>перед Func <T, bool>? - PullRequest
5 голосов
/ 04 января 2011

Есть ли какое-либо значение для использования предиката над обычным делегатом?Принимая пример ниже, я не вижу ничего.

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

Ответы [ 5 ]

5 голосов
/ 04 января 2011

Они фактически одинаковы.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");
}
0 голосов
/ 22 марта 2011

Для соответствия с LINQ я склонен определять Func<T, bool> более Predicate<T>.

0 голосов
/ 04 января 2011

Они фактически одинаковы. Тем не менее, методы расширения (в вашей личной или чужой библиотеке) с большей вероятностью будут определены на Func<T, TResult>, поэтому я бы предпочел этот.

0 голосов
/ 04 января 2011

Только то, что его использует куча кода библиотеки, предоставленного Microsoft.

Например: List.FindAll необходимо передать Predicate.

Для вашего собственного кода вы можете использовать тот, который вам нравится.Вы могли бы даже использовать Converter<int, bool>.

0 голосов
/ 04 января 2011

Предикат является делегатом.Это делегат, определенный в .Net Framework 3.0.Предикат всегда возвращает логическое значение.Таким образом, оба делегата в вашем коде эквивалентны.Другими делегатами, предоставленными .Net, являются Func и Action.Действие возвращает пустоту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...