2009-08-22 10 views

Antwort

10

Es gibt mehrere Anwendungsfälle, in denen der Aufrufer eine Funktion bereitstellen kann, die true oder false zurückgibt. Der Predicate<T> Typ ist eine Möglichkeit, dies zu tun. Dies ist nicht anders als Func<T, bool> (außer Predicate<T> war in früheren Versionen von C# verfügbar).

ein einfaches (und erfundenes Beispiel):

string[] strings = new string[] { "hello", "goodbye", "how are you" }; 

Array.FindAll(strings, delegate(string s) 
          { 
           return s.StartsWith("h"); 
          }); 

oder Lambda-Art:

Array.FindAll(strings, s => s.StartsWith("h")); 

FindAll Die Methode liefert einen Array aller Elemente, die die Bedingung entsprechen. In diesem Fall alle Strings, die mit "h" beginnen. Die Predicate ist s.StartsWith("h").

Die nützliche Sache hier ist, dass die Klasse Array weiß, wie man alle seine Elemente durchsucht, und ein neues Array erstellt, das nur die Elemente enthält, die übereinstimmen. Dieser Teil des Algorithmus ist vielen Code-Teilen gemeinsam. Der Teil, der nicht üblich ist, ist das Übereinstimmungskriterium, das basierend auf den Anforderungen des spezifischen Codeabschnitts variiert. Daher gibt der Aufrufer diesen Teil der Logik an und übergibt ihn als Predicate.

Sie können behandeln es in einem "verschachtelten" Stil. Func<Predicate<T>> bedeutet, dass Sie eine Funktion deklarieren, die eine Predicate<T> zurückgibt. Bist du sicher, dass du das willst? Was versuchst du zu erreichen?

+0

Vielen Dank! Ich kannte bereits die Syntax für VS2008: MyList Liste; list.RemoveAll (l => l.Name == "N/A"); Aber ich brauchte die Syntax für VS2005, und Ihre Antwort funktionierte: list.RemoveAll (Delegate (MyList l)) {return l.Name.StartsWith ("N/A");}); – JohnB

0

Dies definiert eine Funktion, die das Prädikat zurückgibt (eine Funktion, die true oder false zurückgibt). Wie kannst du das benutzen? Sie können die Verantwortlichkeit des Prädikats, das an Sie zurückgegeben wird, entfernen, indem Sie dieses an eine andere Funktion delegieren, deren Aufgabe es ist, nicht Wahr oder Falsch zurückzugeben, sondern Sie die Ausführung des Prädikats zu verzögern, wenn Sie möchten.

2
// Make a list of integers. 
List<int> list = new List<int>(); 
list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 }); 
// Call FindAll() using traditional delegate syntax. 
Predicate<int> callback = new Predicate<int>(IsEvenNumber); 
List<int> evenNumbers = list.FindAll(callback); 

// Target for the Predicate<> delegate. 
static bool IsEvenNumber(int i) 
{ 
    // Is it an even number? 
    return (i % 2) == 0; 
} 
+0

Ausgezeichnet! Danke Chef. – user160677