Kai Frische
Kai Frische

Reputation: 87

LINQ where doesn't accept 1 or 2 parameters

The following code with a boolean parameter works pretty well:

public List<T> SearchByStatus(bool status, List<T> list)
{
    return (List<T>)list.Where(_item => _item.Executed == status);
}

But if I want to use something like this

public List<T> SearchByCodeType(ECodes codeType, List<T> list)
{
    return (List<T>)list.Where(_item => _item.CodeType == codeType);
}

, the IDE throws an error saying Func<T, int, bool> doesn't accept 1 parameter. I researched a bit and found for example this. If I now add a seond parameter, lets say

public List<T> SearchByCodeType(ECodes codeType, List<T> list)
{
    return (List<T>)list.Where((_item, _index) => _item.CodeType == codeType);
}

it says Func<T, bool> doens't accept 2 parameters.

The messages itself are correct, but I don't get why it assumes I want to use the overloaded version of Where in the first case and the non-overloaded in the second... Am I doing something wrong?

P.S.: The ECodes-type used is defined as

public enum ECodes : int
{
    ....
}

May that cause the issue?

Upvotes: 1

Views: 108

Answers (1)

Marc Gravell
Marc Gravell

Reputation: 1062820

Both of these should work fine:

public List<T> SearchByCodeType(ECodes codeType, List<T> list)
{
    return list.Where((_item, _index) => _item.CodeType == codeType).ToList();
}

public List<T> SearchByCodeType(ECodes codeType, List<T> list)
{
    return list.Where(_item => _item.CodeType == codeType).ToList();
}

If they don't - please check whether you have using System.Linq; at the top, and are using regular LINQ (not something obscure like LINQBridge).

You could also use:

public List<T> SearchByCodeType(ECodes codeType, List<T> list)
{
    return list.FindAll(_item => _item.CodeType == codeType);
}

Note that all of this assumes that you have a suitable generic constraint on T such that T.CodeType is well-defined - presumably:

class Foo<T> where T : IHazCodeType
{
    List<T> SearchByCodeType(ECodes codeType, List<T> list) {...}
}
interface IHazCodeType
{
    ECodes CodeType {get;}    
}

Upvotes: 5

Related Questions