我正在尝试创建一个方法,我可以将Linq
表达式作为参数传递,以返回新的项目列表。
目前我这样做(Git Plugin documentation):
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;
}
}
'List'不包含'Where'的定义和最佳扩展方法重载'Queryable.Where(IQueryable,Expression&gt;)'需要'IQueryable'类型的接收器
我不确定该怎么做才能解决这个问题。
答案 0 :(得分:7)
List<T>
不是IQueryable<T>
,而是IEnumerable<T>
。对于Where
的{{1}}扩展名,您只能传递委托而不是表达式。
我想你想要这样的东西:
IEnumerable<T>
请注意,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>
的构造函数。
答案 1 :(得分: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>