Was die Verwendung von Delegierten ist Predicate<T>
, so werde ich es als verschachteltes Format wieC# - delegieren Prädikat <T>
Func<Predicate<T>>
umgehen?. Einfaches Beispiel bitte.
Was die Verwendung von Delegierten ist Predicate<T>
, so werde ich es als verschachteltes Format wieC# - delegieren Prädikat <T>
Func<Predicate<T>>
umgehen?. Einfaches Beispiel bitte.
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?
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.
// 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;
}
Ausgezeichnet! Danke Chef. – user160677
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