9 ответов:
предикат-это функция, которая возвращает
trueилиfalse. Делегат предиката-это ссылка на предикат.таким образом, в основном делегат предиката является ссылкой на функцию, которая возвращает
trueилиfalse. Предикаты очень полезны для фильтрации списка значений-вот пример.using System; using System.Collections.Generic; class Program { static void Main() { List<int> list = new List<int> { 1, 2, 3 }; Predicate<int> predicate = new Predicate<int>(greaterThanTwo); List<int> newList = list.FindAll(predicate); } static bool greaterThanTwo(int arg) { return arg > 2; } }теперь, если вы используете C# 3, Вы можете использовать лямбду для представления предиката более чистым способом:
using System; using System.Collections.Generic; class Program { static void Main() { List<int> list = new List<int> { 1, 2, 3 }; List<int> newList = list.FindAll(i => i > 2); } }
ведущий от ответа Андрея в отношении c#2 и c#3 ... вы также можете сделать их встроенными для одной функции поиска (см. ниже).
using System; using System.Collections.Generic; class Program { static void Main() { List<int> list = new List<int> { 1, 2, 3 }; List<int> newList = list.FindAll(delegate(int arg) { return arg> 2; }); } }надеюсь, что это помогает.
просто делегат, который возвращает boolean. Он используется много в списках фильтрации, но может быть использован везде, где вы хотите.
List<DateRangeClass> myList = new List<DateRangeClass<GetSomeDateRangeArrayToPopulate); myList.FindAll(x => (x.StartTime <= minDateToReturn && x.EndTime >= maxDateToReturn):
есть хорошая статья о предикатах здесь, хотя это из эпохи. NET2, поэтому там нет упоминания о лямбда-выражениях.
методы поиска на основе предикатов позволяют делегату метода или лямбда-выражению решить, является ли данный элемент "совпадением"." Предикат - это просто делегат, принимающий объект и возвращающий значение true или false: открытый делегат логический предикат (объект);
static void Main() { string[] names = { "Lukasz", "Darek", "Milosz" }; string match1 = Array.Find(names, delegate(string name) { return name.Contains("L"); }); //or string match2 = Array.Find(names, delegate(string name) { return name.Contains("L"); }); //or string match3 = Array.Find(names, x => x.Contains("L")); Console.WriteLine(match1 + " " + match2 + " " + match3); // Lukasz Lukasz Lukasz } static bool ContainsL(string name) { return name.Contains("L"); }
что такое делегат сказуемое?
1) предикат-это функция, которая возвращает true или false.Эта концепция появилась в .NET 2.0 framework. 2) он используется с лямбда-выражением (=>). Он принимает универсальный тип в качестве аргумента. 3) он позволяет определить функцию предиката и передать ее в качестве параметра другой функции. 4) это частный случай a
Func, в том, что она принимает только один параметр и всегда возвращает bool.В C# пространство имен:
namespace System { public delegate bool Predicate<in T>(T obj); }он определен в пространстве имен System.
где мы должны использовать делегат сказуемое?
мы должны использовать делегат предиката в следующих случаях:
1) для поиска элементов в общей коллекции. например,
var employeeDetails = employees.Where(o=>o.employeeId == 1237).FirstOrDefault();2) основной пример, который сокращает код и возвращает true или false:
Predicate<int> isValueOne = x => x == 1;теперь вызовите выше предикат:
Console.WriteLine(isValueOne.Invoke(1)); // -- returns true.3) анонимный метод может также назначается тип делегата предиката, как показано ниже:
Predicate<string> isUpper = delegate(string s) { return s.Equals(s.ToUpper());}; bool result = isUpper("Hello Chap!!");какие-либо рекомендации о предикатах?
вместо предикатов используйте Func, лямбда-выражения и делегаты.
Если вы находитесь в VB 9 (VS2008), предикат может быть сложной функцией:
Dim list As New List(Of Integer)(New Integer() {1, 2, 3}) Dim newList = list.FindAll(AddressOf GreaterThanTwo) ... Function GreaterThanTwo(ByVal item As Integer) As Boolean 'do some work' Return item > 2 End Functionили вы можете написать свой предикат как лямбда, если это только одно выражение:
Dim list As New List(Of Integer)(New Integer() {1, 2, 3}) Dim newList = list.FindAll(Function(item) item > 2)
предикат-это функциональная конструкция, обеспечивающая удобный способ в основном тестирования, если что-то верно для данного объекта T.
например, предположим у меня есть класс:
class Person { public string Name { get; set; } public int Age { get; set; } }теперь предположим, что у меня есть список людей, и я хочу знать, есть ли кто-нибудь по имени Оскар в списке.
без использования предиката (или Linq, или любой из этих причудливых вещей), я всегда мог бы сделать это, выполнив следующее:
Person oscar = null; foreach (Person person in people) { if (person.Name == "Oscar") { oscar = person; break; } } if (oscar != null) { // Oscar exists! }это нормально, но тогда, скажем, я хочу проверить, есть ли человек по имени "Рут"? Или человек, которому 17 лет?
используя предикат, я могу найти эти вещи, используя намного меньше кода:
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, который принимает предикат, просто перечисляет в конце концов. То же верно для многих функций Linq.
Итак, давайте посмотрим на конкретный код в вашем вопросе:
Predicate<int> pre = delegate(int a){ return a % 2 == 0; };здесь у нас есть предикат pre, который принимает int a и возвращает % 2 == 0.
это по существу тестирование для четного числа. Что это значит:
pre(1) == false; pre(2) == true;и так далее. Это также означает, что, если у вас есть список целых чисел и вы хотите найти первое четное число, вы можете просто сделать это:
int firstEven = ints.Find(pre);конечно, как и любой другой тип, который вы можете использовать в коде, это хорошая идея, чтобы дать вашим переменным описательные имена; поэтому я бы посоветовал изменить выше pre на что-то вроде evenFinder или isEven-что-то в этом роде. Тогда приведенный выше код намного яснее:
int firstEven = ints.Find(evenFinder);
делегат определяет ссылочный тип, который может использоваться для инкапсуляции метода с определенной сигнатурой. C# делегировать жизненный цикл: Жизненный цикл делегата C# -
- декларация
- экземпляров
- INVACATION
подробнее форма http://asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html
Comments