Pregunta

Tengo un método que acepta una Expresión < 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 List. ¿Conoces una manera simple de hacer esto?

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

Update

Combinando 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();
}
¿Fue útil?

Solución

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

Editar: según los comentarios tenemos una mejor respuesta para la segunda línea:

Predicate<T> pred = func.Invoke;

Otros consejos

No veo la necesidad de este método. Simplemente use Where ().

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

O incluso mejor, defina la expresión como una lambda en línea.

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

Otras opciones que no se han mencionado:

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

Esto genera la misma IL que

Func<T, bool> func = expression.Compile();
Predicate<T> predicate = func.Invoke;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top