with - tutorialspoint c# delegate




Prädikat Delegaten in C# (6)

Ausgehend von Andrews Antwort in Bezug auf c # 2 und c # 3 ... können Sie sie auch inline für eine einmalige Suchfunktion ausführen (siehe unten).

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

Hoffe das hilft.

Kannst du mir erklären;

  • Was ist ein Predicate Delegate?
  • Wo sollten wir Prädikate verwenden?
  • Best Practices bei der Verwendung von Prädikaten?

Beschreibender Quellcode wird geschätzt,

Danke für alle Antworten!


Die Prädikat-basierten Suchmethoden ermöglichen es einem Methodendelegaten oder Lambda-Ausdruck zu entscheiden, ob ein bestimmtes Element eine "Übereinstimmung" ist. Ein Prädikat ist einfach ein Delegat, der ein Objekt annimmt und wahr oder falsch zurückgibt: public delegate bool Prädikat (T-Objekt);

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

Es gibt hier einen guten Artikel über Prädikate, obwohl es aus der .NET2-Ära stammt, also werden darin keine Lambda-Ausdrücke erwähnt.


Nur ein Delegat, das einen booleschen Wert zurückgibt. Es wird häufig in Filterlisten verwendet, kann aber überall verwendet werden.

List<DateRangeClass>  myList = new List<DateRangeClass<GetSomeDateRangeArrayToPopulate);
myList.FindAll(x => (x.StartTime <= minDateToReturn && x.EndTime >= maxDateToReturn):

Wenn Sie in VB 9 (VS2008) sind, kann ein Prädikat eine komplexe Funktion sein:

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

Oder Sie können Ihr Prädikat als Lambda schreiben, solange es nur einen Ausdruck gibt:

Dim list As New List(Of Integer)(New Integer() {1, 2, 3})
Dim newList = list.FindAll(Function(item) item > 2)

Was ist Predicate Delegate?

1) Prädikat ist eine Funktion, die wahr oder falsch zurückgibt. Dieses Konzept ist in .net 2.0 Framework gekommen. 2) Es wird mit Lambda-Ausdruck (=>) verwendet. Es nimmt den generischen Typ als Argument an. 3) Es erlaubt eine Prädikatfunktion zu definieren und als Parameter an eine andere Funktion zu übergeben. 4) Es ist ein Spezialfall eines Func , da er nur einen einzigen Parameter benötigt und immer einen Func zurückgibt.

Im C # -Namespace:

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

Es ist im System-Namespace definiert.

Wo sollten wir Predicate Delegate verwenden?

Wir sollten Predicate Delegate in den folgenden Fällen verwenden:

1) Zum Suchen von Objekten in einer generischen Sammlung. z.B

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

2) Grundlegendes Beispiel, das den Code verkürzt und wahr oder falsch zurückgibt:

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

Rufen Sie jetzt das obige Prädikat auf:

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

3) Eine anonyme Methode kann auch einem Predicate-Delegattyp wie folgt zugewiesen werden:

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

Best Practices zu Prädikaten?

Verwenden Sie Func, Lambda Expressions und Delegates anstelle von Prädikaten.





predicate