Делегаты предикатов в C#



не могли бы вы объяснить мне;




  • что такое делегат сказуемое?

  • где мы должны использовать предикаты?

  • какие-либо рекомендации при использовании предикатов?


описательный исходный код будет оценен,



Спасибо за все ответы!

1116   9  

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

    Ничего не найдено.