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();
}