2009-08-01 5 views
42

J'ai une méthode qui accepte un Expression<Func<T, bool>> comme paramètre. Je voudrais l'utiliser comme un prédicat dans la méthode List.Find(), mais je n'arrive pas à le convertir en un prédicat que List prend. Connaissez-vous un moyen simple de le faire?Comment convertir une expression <Func <T, bool>> en un prédicat <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); 
} 

Mise à jour

La combinaison des réponses de tvanfosson et 280Z28, je suis maintenant en utilisant ceci:

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

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

Répondre

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

Edit: par les commentaires que nous avons une meilleure réponse pour la deuxième ligne:

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

Parfait! Merci! –

+7

Ou: pred = func.Invoke; –

+0

Oui, func.Invoke a l'air mieux. –

25

Je ne vois pas le besoin de cette méthode. Utilisez simplement Where().

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

Ou mieux encore, définir l'expression comme une ligne lambda.

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

Heh, true. C'est ce que j'ai pour une lecture étroite. –

+0

Utiliser Where() au lieu de Find() est ce que je devais faire. Cependant, votre premier exemple doit utiliser expression.Compile() au lieu de simplement expression. Merci. –

+0

Mis à jour. J'ai négligé le fait que Où prend un Func . – tvanfosson

22

Une autre option qui n'a pas été mentionné:

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

Cela génère le même IL que

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

pourquoi seulement 12 voix? paysans ingrats! C'est lui, Jon Skeet. Tenez compte de ses mots !!!! – jokab

Questions connexes