2009-08-01 38 views
42

我有一個接受Expression<Func<T, bool>>作爲參數的方法。我想將它用作List.Find()方法中的謂詞,但似乎無法將其轉換爲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); 
} 

更新

結合從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); 

編輯:按照意見,我們有第二個更好的答案line:

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

完美!謝謝! – 2009-08-01 23:58:50

+7

或者:pred = func.Invoke; – 2009-08-01 23:59:58

+0

是的,func.Invoke看起來更好。 – 2009-08-02 00:05:29

25

我看不到這種方法的必要性。只需使用Where()。

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

甚至更​​好,將表達式定義爲lambda內聯。

var sublist = list.Where(l => l.ID == id).ToList(); 
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; 
相關問題