2009-04-08 14 views
18

Sì, ho visto this ma non ho trovato la risposta alla mia domanda specifica.Come convertire Func <T, bool> in Predicato <T>?

dato un lambda testLambda che prende T e restituisce un valore booleano (posso farlo sia predicato o Func che tocca a me)

ho bisogno di essere in grado di utilizzare sia List.FindIndex (testLambda) (prende un predicato) e List.Where (testLambda) (prende un Func).

Qualche idea su come fare entrambe le cose?

risposta

37

Facile:

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

Fondamentalmente si può creare una nuova istanza delegato con qualsiasi compatibili esistente esempio. Questo supporta anche varianza (co e contraddizione):

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

Se si vuole rendere generico:

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

Questi tipi di giochi mi fanno arrabbiare. Credo di aver capito perché lo hanno fatto, ma comunque ... –

+0

Avrebbero almeno fornito un sovraccarico per FindIndex –

+0

Che tipo di "giochi"? Cosa intendi? –

7

ho ottenuto questo:

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

Opere, ma sigh.

0

suono come un caso per

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

amo C# 3 ...

3

Sono un po 'in ritardo nel gioco, ma mi piacciono i metodi di estensione:

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

Quindi è possibile utilizzare le cose come:

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, ora vedere il metodo di estensione FindIndex. Questa è una risposta un po 'più generale, immagino. Neanche molto diverso dal ConvertToPredicate.

Problemi correlati