2016-11-30 59 views
0

我試圖創建一個方法,我可以將Linq表達式作爲參數傳遞以返回一個新的項目列表。'列表'不包含'Where'的定義

目前我做這個(based off this answer):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Linq.Expressions; 

class Collection<T> { 

    List<T> items = new List<T>(); 

    public Collection<T> Filter(Expression<Func<T, bool>> query) { 
     Collection<T> c = new Collection<T>(); 
     c = items.Where(query); 
     return c; 
    } 
} 

'列表' 不包含 '去哪兒' 的定義和最佳推廣方法重載「Queryable.Where(IQueryable的,表達>) '需要一個'IQueryable'類型的接收器

我不確定在這裏要做什麼來解決這個問題。

+0

對於[如果](HTTPS:/ /msdn.microsoft.com/en-us/library/bb534803(v=vs.110).aspx)你需要傳遞一個'Func '這不是你的'query'。 –

+0

當你做'c = items.Where(query);'時,你沒有填充集合,而是試圖創建一個新集合。請參閱Rene Vogt的解答。 –

回答

4

List<T>不是IQueryable<T>而是IEnumerable<T>。對於IEnumerable<T>Where擴展名,您只能傳遞委託而不是表達式。

我想你想這樣的事情:

public Collection<T> Filter(Func<T, bool> query) // only the lambda, NO expression 
{ 
    Collection<T> c = new Collection<T>(items.Where(query).ToList()); 
    return c; 
} 

注意Where只返回一個IEnumerable<T>但不是一個Collection<T>。因此,您需要將c轉換爲List<T>並將其傳遞給Collection<T>的構造函數。

1

如果您絕對必須使用表達式,您可以執行一些操作。你可以做這樣的事情:

public ICollection<T> Filter(Expression<Func<T, bool>> query) {  
    return items.AsQueryable().Where(query).ToList(); 
} 

IList轉換你的Queryable或者你可以這樣做:

public ICollection<T> Filter(Expression<Func<T, bool>> query) {  
    return items.Where(query.Compile()).ToList(); 
} 

編譯你的表情到Func<T, bool>

相關問題