2009-08-01 10 views
42

Tengo un método que acepta un Expression<Func<T, bool>> como parámetro. Me gustaría usarlo como un predicado en el método List.Find(), pero parece que no puedo convertirlo en un Predicado que toma la Lista. ¿Conoces una manera simple de hacer esto?Cómo convertir una expresión <Func <T, bool>> a un Predicado <T>

public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new() 
{ 
    var list = GetList<T>(); 

    var predicate = [what goes here to convert expression?]; 

    return list.Find(predicate); 
} 

actualización

Combinando las respuestas de tvanfosson y 280Z28, ahora estoy usando esto:

public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new() 
{ 
    var list = GetList<T>(); 

    return list.Where(expression.Compile()).ToList(); 
} 

Respuesta

46
Func<T, bool> func = expression.Compile(); 
Predicate<T> pred = t => func(t); 

Editar: por los comentarios que tenemos una mejor respuesta para la segunda línea:

Predicate<T> pred = func.Invoke; 
+0

perfecto! ¡Gracias! –

+7

O bien: pred = func.Invocar; –

+0

Sí, func.Invoke se ve mejor. –

25

No veo la necesidad de este método. Solo usa Where().

var sublist = list.Where(expression.Compile()).ToList(); 

O mejor aún, defina la expresión como un lambda en línea.

var sublist = list.Where(l => l.ID == id).ToList(); 
+1

Heh, cierto. Eso es lo que obtengo por lectura estrecha. –

+0

Usando Where() en lugar de Find() es lo que necesitaba hacer. Sin embargo, su primer ejemplo necesita usar expression.Compile() en lugar de simplemente expression. Gracias. –

+0

Actualizado. Descuidé el hecho de que Where takes a Func . – tvanfosson

22

Otra de las opciones que no se han mencionado:

Func<T, bool> func = expression.Compile(); 
Predicate<T> predicate = new Predicate<T>(func); 

Esto genera el mismo IL como

Func<T, bool> func = expression.Compile(); 
Predicate<T> predicate = func.Invoke; 
+4

¿por qué esto solo tiene 12 votos? ¡Ingratos campesinos! Es él, Jon Skeet. ¡¡Presta atención a sus palabras !! – jokab

Cuestiones relacionadas