2009-08-01 20 views
42

Ho un metodo che accetta un parametro Expression<Func<T, bool>>. Vorrei usarlo come predicato nel metodo List.Find(), ma non riesco a convertirlo in un predicato che prende l'elenco. Conosci un modo semplice per farlo?Come convertire un'espressione <Func <T, bool>> in un predicato <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); 
} 

Aggiornamento

La combinazione di risposte da tvanfosson e 280Z28, ora sto usando questo:

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

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

risposta

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

Edit: per i commenti che abbiamo una risposta migliore per la seconda riga:

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

Perfetto! Grazie! –

+7

Oppure: pred = func.Invoke; –

+0

Sì, func.Invoke sembra migliore. –

25

Non vedo l'esigenza di questo metodo. Basta usare Where().

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

O meglio ancora, definire l'espressione come lambda in linea.

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

Heh, vero. Questo è quello che ottengo per una lettura ristretta. –

+0

Utilizzare Where() anziché Find() è ciò che dovevo fare. Comunque il tuo primo esempio deve usare expression.Compile() invece di solo expression. Grazie. –

+0

Aggiornato. Ho trascurato il fatto che Dove prende un Func . – tvanfosson

22

Un'altra opzione che non è stato menzionato:

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

Questo genera lo stesso IL come

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

perché questo ha solo 12 voti? voi contadini ingrati! È lui, Jon Skeet. Ascolta le sue parole !!!! – jokab

Problemi correlati