Что такое предикат в c#? [дубликат]

Мой ответ "пользовательского интерфейса": Вы уверены , Ваши пользователи хотят свое высвечивание браузеров или делают , Вы думаете , это - то, что они хотят? Если бы я был тем с помощью программного обеспечения, я знаю, что раздражался бы, если бы эти предупреждения происходили очень часто и стояли на пути.

, Если Вы уверены, что хотите сделать это этот путь, используйте поле предупреждения JavaScript. Это - то, что Google Calendar делает для напоминаний о событии, и они, вероятно, помещают некоторую мысль в него.

веб-страница А действительно не является лучшим носителем для предупреждений необходимости. При разработке чего-то вроде "ZOMG серверы снижаются!" предупреждения, автоматизированные электронные письма или SMS-сообщения правильным людям могли бы добиться цели.

163
задан BradleyDotNET 11 June 2014 в 16:22
поделиться

3 ответа

Predicate - это функциональная конструкция, предоставляющая удобный способ в основном проверить, верно ли что-то для данного объекта T .

Например, предположим, У меня есть класс:

class Person {
    public string Name { get; set; }
    public int Age { get; set; }
}

Теперь предположим, что у меня есть List людей , и я хочу знать, есть ли в списке кто-нибудь по имени Оскар.

Без с использованием ] Predicate (или Linq, или что-то в этом роде), я всегда мог бы добиться этого, выполнив следующие действия:

Person oscar = null;
foreach (Person person in people) {
    if (person.Name == "Oscar") {
        oscar = person;
        break;
    }
}

if (oscar != null) {
    // Oscar exists!
}

Это нормально, но, допустим, я хочу проверить, есть ли человек по имени "Рут"? Или человек, которому 17 лет?

Используя Predicate , я могу найти эти вещи, используя НАМНОГО меньше кода:

Predicate<Person> oscarFinder = (Person p) => { return p.Name == "Oscar"; };
Predicate<Person> ruthFinder = (Person p) => { return p.Name == "Ruth"; };
Predicate<Person> seventeenYearOldFinder = (Person p) => { return p.Age == 17; };

Person oscar = people.Find(oscarFinder);
Person ruth = people.Find(ruthFinder);
Person seventeenYearOld = people.Find(seventeenYearOldFinder);

Обратите внимание, я сказал много меньше кода , не намного быстрее . Распространенное заблуждение разработчиков состоит в том, что если что-то занимает одну строку, оно должно работать лучше, чем то, что занимает десять строк. Но за кулисами метод Find , который принимает Predicate , в конце концов, просто перечисляет. То же самое верно для многих функций Linq.

Итак, давайте посмотрим на конкретный код в вашем вопросе:

Predicate<int> pre = delegate(int a){ return a % 2 == 0; };

Здесь у нас есть Predicate pre , который принимает ] int a и возвращает a% 2 == 0 . По сути, это проверка на четное число. Это означает:

pre(1) == false;
pre(2) == true;

И так далее. Это также означает, что если у вас есть List ints и вы хотите найти первое четное число, вы можете просто сделать это:

int firstEven = ints.Find(pre);

Конечно, как и в случае с любым другим типом, который вы можете использовать в коде, рекомендуется давать вашим переменным описательные имена; поэтому я бы посоветовал изменить вышеуказанный pre на что-то вроде evenFinder или isEven - что-то в этом роде. Тогда приведенный выше код будет намного понятнее:

int firstEven = ints.Find(evenFinder);
458
ответ дан 23 November 2019 в 21:14
поделиться

По определению предикат всегда будет возвращать логическое значение.

Предикат в основном идентичен to Func .

Предикаты очень полезны в программировании. Они часто используются, чтобы позволить вам предоставить логику во время выполнения, которая может быть настолько простой или сложной, насколько это необходимо.

Например, WPF использует Predicate в качестве входных данных для фильтрации ListView. ICollectionView. Это позволяет вам написать логику, которая может возвращать логическое значение, определяющее, должен ли конкретный элемент быть включен в окончательное представление. Логика может быть очень простой (просто вернуть логическое значение для объекта) или очень сложной, все зависит от вас.

43
ответ дан 23 November 2019 в 21:14
поделиться

В C # предикаты - это просто делегаты, возвращающие логические значения. Они полезны (по моему опыту), когда вы просматриваете коллекцию объектов и хотите что-то конкретное.

Я недавно столкнулся с ними при использовании сторонних веб-элементов управления (например, древовидных представлений), поэтому, когда мне нужно найти узел в дереве, я использую метод .Find () и передаю предикат, который вернет конкретный узел. Я ищу. В вашем примере, если 'a' mod 2 равен 0, делегат вернет true. Конечно, когда я ищу узел в древовидной структуре, я сравниваю его имя, текст и свойства значения на предмет совпадения. Когда делегат находит совпадение, он возвращает конкретный узел, который я искал.

14
ответ дан 23 November 2019 в 21:14
поделиться