2009-04-08 18 views
18

Sí, he visto this pero no he podido encontrar la respuesta a mi pregunta específica.Cómo convertir Func <T, bool> al predicado <T>?

dado un lambda testLambda que lleva T y devuelve un valor lógico (Puedo hacer que sea predicado o Func que depende de mí)

necesito para poder utilizar tanto List.FindIndex (testLambda) (toma un predicado) y List.Where (testLambda) (toma un Func).

¿Alguna idea de cómo hacer las dos cosas?

Respuesta

37

Fácil:

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

Básicamente se puede crear una nueva instancia de delegado con cualquier compatibles instancia existente. Esto también es compatible con la varianza (co- y contradicción):

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

Si usted quiere que sea genérica:

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

Este tipo de juegos me enojan. Supongo que entiendo por qué lo hicieron, pero aún así ... –

+0

Al menos podrían haber proporcionado una sobrecarga para FindIndex –

+0

¿Qué tipo de "juegos"? ¿Qué quieres decir? –

7

Tengo esto:

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

Works, pero ick.

0

sonido como un caso de

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

Me encanta C# 3 ...

3

Llego un poco tarde al juego, pero me gustan los métodos de extensión:

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

A continuación, puede utilizarlo como:

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, ahora ver el método de extensión FindIndex. Esta es una respuesta un poco más general, supongo. No es muy diferente de ConvertToPredicate tampoco.

Cuestiones relacionadas