Predykat Delegatów w C#

Możesz mi wyjaśnić;

  • Czym jest Delegat predykatu?
  • gdzie powinniśmy używać predykatów?
  • jakieś najlepsze praktyki przy użyciu predykatów?

Opisowy kod źródłowy zostanie doceniony,

Dzięki za wszystkie odpowiedzi!

Author: niico, 2009-02-17

9 answers

Predykat jest funkcją, która zwraca true lub false. Delegat predykatu jest odniesieniem do predykatu.

Więc zasadniczo delegat predykatu jest odwołaniem do funkcji, która zwraca true lub false. Predykaty są bardzo przydatne do filtrowania listy wartości - oto przykład.

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;
    }
}

Teraz, jeśli używasz C# 3, możesz użyć lambda do reprezentowania predykatu w czystszy sposób:

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);
    }
}
 308
Author: Andrew Hare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-17 11:45:55

Kontynuując odpowiedź Andrzeja w odniesieniu do c # 2 i c # 3 ... możesz również wykonać je w wierszu dla jednorazowej funkcji wyszukiwania(patrz poniżej).

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;
                           });
    }
}
Mam nadzieję, że to pomoże.
 80
Author: WestDiscGolf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-17 11:56:23

Tylko delegat, który zwraca wartość logiczną. Jest często używany w filtrowaniu list, ale może być używany wszędzie tam, gdzie chcesz.

List<DateRangeClass>  myList = new List<DateRangeClass<GetSomeDateRangeArrayToPopulate);
myList.FindAll(x => (x.StartTime <= minDateToReturn && x.EndTime >= maxDateToReturn):
 10
Author: Adam Carr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-17 12:56:47

Jest tu dobry artykuł o predykatach , chociaż pochodzi z ery. NET2, więc nie ma tam wzmianki o wyrażeniach lambda.

 8
Author: LukeH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-22 00:41:38

Metody wyszukiwania oparte na predykatach pozwalają delegatowi metody lub wyrażeniu lambda zdecydować, czy dany element jest "dopasowaniem"." Predykat to po prostu delegat przyjmujący obiekt i zwracający wartość true lub false: public delegate bool Predicate (T object);

   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"); }
 4
Author: lukaszk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-20 21:41:40

Co To jest Predicate Delegate?

1) predykat jest funkcją, która zwraca true lub false.Ta koncepcja pojawiła się w. Net 2.0 framework. 2) jest używany z wyrażeniem lambda (=>). Przyjmuje typ generic jako argument. 3) pozwala na zdefiniowanie funkcji predykatu i przekazanie jej jako parametru innej funkcji. 4) jest to szczególny przypadek Func, w którym pobiera tylko jeden parametr i zawsze zwraca bool.

W przestrzeni nazw C#:

namespace System
{   
    public delegate bool Predicate<in T>(T obj);
}

Jest zdefiniowana w przestrzeni nazw systemu.

Gdzie powinniśmy używać Predicate Delegate?

Powinniśmy używać Predicate Delegate w następujących przypadkach:

1) do wyszukiwania przedmiotów w ogólnej kolekcji. np.

var employeeDetails = employees.Where(o=>o.employeeId == 1237).FirstOrDefault();

2) podstawowy przykład, który skraca kod i zwraca true lub false:

Predicate<int> isValueOne = x => x == 1;

Teraz zadzwoń powyżej predykatu:

Console.WriteLine(isValueOne.Invoke(1)); // -- returns true.

3) anonimowa metoda może być również przypisana do typu delegata predykatu, jak poniżej:

Predicate<string> isUpper = delegate(string s) { return s.Equals(s.ToUpper());};
    bool result = isUpper("Hello Chap!!");

Any best praktyki dotyczące predykatów?

Używaj wyrażeń Func, Lambda i delegatów zamiast predykatów.

 4
Author: Gul Md Ershad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-05 15:50:22

Jeśli jesteś w VB 9 (VS2008), predykat może być funkcją złożoną:

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

Lub możesz napisać swój predykat jako lambda, o ile jest to tylko jedno wyrażenie:

Dim list As New List(Of Integer)(New Integer() {1, 2, 3})
Dim newList = list.FindAll(Function(item) item > 2)
 2
Author: danlash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-01 18:25:53

Predykat jest konstrukcją funkcjonalną zapewniającą wygodny sposób sprawdzenia, czy coś jest prawdą o danym obiekcie T.

Na przykład, załóżmy, że mam klasę:

    class Person {
          public string Name { get; set; }
          public int Age { get; set; }
         }
Powiedzmy, że mam listę ludzi i chcę wiedzieć, czy na liście jest ktoś o imieniu Oscar.

Bez użycia predykatu (lub Linq, lub jakiejkolwiek z tych fantazyjnych rzeczy), zawsze mogłem to osiągnąć, wykonując następujące czynności:

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

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

To jest w porządku, ale powiedzmy, że chcę sprawdzić, czy jest osoba o imieniu "Ruth"? Albo osoba, która ma 17 lat?

Używając predykatu, mogę znaleźć te rzeczy używając dużo mniej kodu:

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

Zauważ, że powiedziałem o wiele mniej kodu, nie o wiele szybciej. Powszechne błędne przekonanie programistów jest to, że jeśli coś zajmuje jedną linię, musi działać lepiej niż coś, co zajmuje dziesięć linii. Ale za kulisami, metoda znalezienia, która bierze predykat, jest po prostu wyliczanie. To samo dotyczy wielu Linq ' ów funkcjonalność.

Przyjrzyjmy się więc konkretnemu kodowi w twoim pytaniu:
Predicate<int> pre = delegate(int a){ return a % 2 == 0; };

Tutaj mamy predykat pre, który pobiera int a i zwraca % 2 == 0.

Jest to zasadniczo test dla liczby parzystej. Co to znaczy:

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

I tak dalej. Oznacza to również, że jeśli masz listę ints i chcesz znaleźć pierwszą liczbę parzystą, możesz to zrobić:

int firstEven = ints.Find(pre);

Oczywiście, jak w przypadku każdego innego typu, którego można użyć w kodzie, dobrym pomysłem jest podanie Twoje zmienne opisowe nazwy; więc radzę zmienić powyższe pre na coś w rodzaju evenFinder lub isEven -- coś w tym stylu. Wtedy powyższy kod jest o wiele jaśniejszy:

int firstEven = ints.Find(evenFinder);
 0
Author: Jatinder Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-26 05:18:17

Delegat definiuje typ odniesienia, który może być użyty do hermetyzacji metody za pomocą określonego podpisu. c # cykl życia delegata: Cykl życia C # delegate to

  • Deklaracja
  • instancja
  • INVACATION

Dowiedz się więcej formularz http://asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html

 -2
Author: parijat mishra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-24 11:00:55