我正在尝试创建一个方法,我可以将Linq表达式作为参数传递,以返回新的项列表.
目前我这样做(根据这个答案):
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;
}
}
Run Code Online (Sandbox Code Playgroud)
'List'不包含'Where'的定义和最佳扩展方法重载'Queryable.Where(IQueryable,Expression>)'需要一个'IQueryable'类型的接收器
我不确定该怎么做才能解决这个问题.
List<T>不是IQueryable<T>但是IEnumerable<T>.对于Where扩展名,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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,Where只返回IEnumerable<T>但不返回Collection<T>.所以你需要转换c为a List<T>并将其传递给构造函数Collection<T>.