2009-08-01 3 views
42

У меня есть метод, который принимает параметр Expression<Func<T, bool>> в качестве параметра. Я хотел бы использовать его как предикат в методе List.Find(), но я не могу преобразовать его в Predicate, который принимает List. Вы знаете простой способ сделать это?Как преобразовать выражение <Func <T, bool>> в предикат <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); 
} 

Update

Объединяя ответы от tvanfosson и 280Z28, сейчас я использую это:

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

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

ответ

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

Edit: в комментарии, которые мы имеем лучший ответ на второй line:

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

совершенен! Благодаря! –

+7

Или: pred = func.Invoke; –

+0

Да, func.Invoke выглядит лучше. –

25

Я не вижу необходимости в этом методе. Просто используйте Where().

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

Или еще лучше, определите выражение как встроенный лямбда.

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

Хех, правда. Это то, что я получаю для узкого чтения. –

+0

Использование Where() вместо Find() - это то, что мне нужно было сделать. Однако ваш первый пример должен использовать выражение expression.Compile() вместо выражения. Благодарю. –

+0

Обновлено. Я пренебрег тем, что где принимает Func . – tvanfosson

22

Другие варианты, которые не были упомянуты:

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

Это порождает тот же IL, как

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

почему у этого только 12 голосов? вы неблагодарные крестьяне! Это он, Джон Скит. Послушайте его слова !!!! – jokab

Смежные вопросы