2009-04-08 16 views
18

Ja, ich habe this gesehen, aber ich konnte die Antwort auf meine spezifische Frage nicht finden.Wie konvertiert man Func <T, bool> in Prädikat <T>?

eine Lambda testLambda gegeben, dass T und gibt einen boolean (ich es machen kann entweder Prädikat oder Func, die an mich)

nimmt Ich muß in der Lage sein zu verwenden, um sowohl List.FindIndex (testLambda) (nimmt ein Prädikat) und List.Where (testLambda) (nimmt einen Func).

Irgendwelche Ideen, wie man beides macht?

Antwort

37

Ganz einfach:

Func<string,bool> func = x => x.Length > 5; 
Predicate<string> predicate = new Predicate<string>(func); 

Grundsätzlich können Sie eine neue Delegatinstanz mit jeder kompatibel vorhandenen Instanz erstellen. Dies unterstützt auch die Varianz (Co- und Wider-):

Action<object> actOnObject = x => Console.WriteLine(x); 
Action<string> actOnString = new Action<string>(actOnObject); 

Func<string> returnsString =() => "hi"; 
Func<object> returnsObject = new Func<object>(returnsString); 

Wenn Sie es generische machen wollen:

static Predicate<T> ConvertToPredicate<T>(Func<T, bool> func) 
{ 
    return new Predicate<T>(func); 
} 
+4

Diese Art von Spielen machen mich wütend. Ich denke, ich verstehe, warum sie das gemacht haben, aber immer noch ... –

+0

Sie hätten zumindest eine Überladung für FindIndex bereitstellen können. –

+0

Was für "Spiele"? Was meinen Sie? –

7

Ich habe diese:

Func<object, bool> testLambda = x=>true; 
int idx = myList.FindIndex(x => testLambda(x)); 

Works, aber ick.

0

Ton wie ein Fall für

static class ListExtensions 
{ 
    public static int FindIndex<T>(this List<T> list, Func<T, bool> f) { 
    return list.FindIndex(x => f(x)); 
    } 
} 

// ... 
Func<string, bool> f = x=>Something(x); 
MyList.FindIndex(f); 
// ... 

Ich liebe C# 3 ...

3

Ich bin ein wenig zu spät zum Spiel, aber ich mag Erweiterungsmethoden:

public static class FuncHelper 
{ 
    public static Predicate<T> ToPredicate<T>(this Func<T,bool> f) 
    { 
     return x => f(x); 
    } 
} 

Dann können Sie es gerne verwenden:

List<int> list = new List<int> { 1, 3, 4, 5, 7, 9 }; 
Func<int, bool> isEvenFunc = x => x % 2 == 0; 
var index = list.FindIndex(isEvenFunc.ToPredicate()); 

Hmm, ich jetzt die Find Erweiterung Methode. Dies ist eine etwas allgemeinere Antwort, denke ich. Nicht wirklich viel anders als das ConvertToPredicate.

Verwandte Themen