Мой ответ "пользовательского интерфейса": Вы уверены , Ваши пользователи хотят свое высвечивание браузеров или делают , Вы думаете , это - то, что они хотят? Если бы я был тем с помощью программного обеспечения, я знаю, что раздражался бы, если бы эти предупреждения происходили очень часто и стояли на пути.
, Если Вы уверены, что хотите сделать это этот путь, используйте поле предупреждения JavaScript. Это - то, что Google Calendar делает для напоминаний о событии, и они, вероятно, помещают некоторую мысль в него.
веб-страница А действительно не является лучшим носителем для предупреждений необходимости. При разработке чего-то вроде "ZOMG серверы снижаются!" предупреждения, автоматизированные электронные письма или SMS-сообщения правильным людям могли бы добиться цели.
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
, который принимает ] int a
и возвращает a% 2 == 0
. По сути, это проверка на четное число. Это означает:
pre(1) == false;
pre(2) == true;
И так далее. Это также означает, что если у вас есть List
и вы хотите найти первое четное число, вы можете просто сделать это:
int firstEven = ints.Find(pre);
Конечно, как и в случае с любым другим типом, который вы можете использовать в коде, рекомендуется давать вашим переменным описательные имена; поэтому я бы посоветовал изменить вышеуказанный pre
на что-то вроде evenFinder
или isEven
- что-то в этом роде. Тогда приведенный выше код будет намного понятнее:
int firstEven = ints.Find(evenFinder);
По определению предикат всегда будет возвращать логическое значение.
Предикат
в основном идентичен to Func
.
Предикаты очень полезны в программировании. Они часто используются, чтобы позволить вам предоставить логику во время выполнения, которая может быть настолько простой или сложной, насколько это необходимо.
Например, WPF использует Predicate
в качестве входных данных для фильтрации ListView. ICollectionView. Это позволяет вам написать логику, которая может возвращать логическое значение, определяющее, должен ли конкретный элемент быть включен в окончательное представление. Логика может быть очень простой (просто вернуть логическое значение для объекта) или очень сложной, все зависит от вас.
В C # предикаты - это просто делегаты, возвращающие логические значения. Они полезны (по моему опыту), когда вы просматриваете коллекцию объектов и хотите что-то конкретное.
Я недавно столкнулся с ними при использовании сторонних веб-элементов управления (например, древовидных представлений), поэтому, когда мне нужно найти узел в дереве, я использую метод .Find () и передаю предикат, который вернет конкретный узел. Я ищу. В вашем примере, если 'a' mod 2 равен 0, делегат вернет true. Конечно, когда я ищу узел в древовидной структуре, я сравниваю его имя, текст и свойства значения на предмет совпадения. Когда делегат находит совпадение, он возвращает конкретный узел, который я искал.