Get Off My Lawn Get Off My Lawn - 6 days ago 6
C# Question

'List' does not contain a definition for 'Where'

I am trying to create a method where I can pass a

Linq
expression as a parameter to return a new list of items.

Currently I am doing this (based off this answer):

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' does not contain a definition for 'Where' and the best extension method overload 'Queryable.Where(IQueryable, Expression>)' requires a receiver of type 'IQueryable'


I am not exactly sure what to do here to fix this.

Answer

List<T> is not IQueryable<T> but IEnumerable<T>. For the Where extension for IEnumerable<T> you can only pass a delegate not an expression.

I guess you want something like that:

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

Note that Where only returns an IEnumerable<T> but not an Collection<T>. So you need to convert c to a List<T> and pass this to the constructor of Collection<T>.