C# ';列表';不包含';其中';

C# ';列表';不包含';其中';,c#,linq,C#,Linq,我正在尝试创建一个方法,在该方法中,我可以将Linq表达式作为参数传递,以返回一个新的项目列表 目前我正在做这个(): 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用System.Linq.Expressions; 类集合{ 列表项=新列表(); 公共集合筛选器(表达式查询){ 集合c=新集合(); c=项目。其中(查询); 返回c; } } “List”不包含“Where”的定义和最佳扩展方法重载“Queryable”。Where(

我正在尝试创建一个方法,在该方法中,我可以将
Linq
表达式作为参数传递,以返回一个新的项目列表

目前我正在做这个():

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Linq.Expressions;
类集合{
列表项=新列表();
公共集合筛选器(表达式查询){
集合c=新集合();
c=项目。其中(查询);
返回c;
}
}
“List”不包含“Where”的定义和最佳扩展方法重载“Queryable”。Where(IQueryable,Expression>)需要类型为“IQueryable”的接收器

我不确定要在这里做些什么来解决这个问题。

列表
不是
IQueryable
,而是
inumerable
。对于
IEnumerable
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;
}
public Collection Filter(Func query)//只有lambda,没有表达式
{
集合c=新集合(items.Where(query.ToList());
返回c;
}

请注意,
其中
只返回一个
IEnumerable
,而不是一个
集合
。因此,您需要将
c
转换为
列表
,并将其传递给
集合的构造函数

如果您必须使用表达式,您可以做几件事。您可以这样做:

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

将表达式编译为
Func

,因为您需要将
Func
传递给它,而这不是
query
的内容。执行
c=items.Where(query),您不是在填充集合,而是(尝试)创建一个新集合。请参阅Rene Vogt的答案以了解解决方案。
public ICollection<T> Filter(Expression<Func<T, bool>> query) {     
    return items.AsQueryable().Where(query).ToList();
}
public ICollection<T> Filter(Expression<Func<T, bool>> query) {     
    return items.Where(query.Compile()).ToList();
}