'List'不包含'Where'的定义

时间:2016-11-30 18:22:43

标签: c# linq

我正在尝试创建一个方法,我可以将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'类型的接收器

我不确定该怎么做才能解决这个问题。

2 个答案:

答案 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>