LINQ在哪里不接受1或2个参数

时间:2013-11-07 13:48:33

标签: c# linq

以下带有布尔参数的代码运行良好:

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

但如果我想使用这样的东西

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

,IDE会抛出一个错误,指出Func<T, int, bool>不接受1个参数。 我研究了一下,发现了例如this。 如果我现在添加一个seond参数,让我们说

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

它说Func<T, bool>不接受2个参数。

消息本身是正确的,但我不明白为什么它假设我想在第一种情况下使用Where的重载版本而在第二种情况下使用非重载......我做错了什么?

P.S。:使用的ECodes类型定义为

public enum ECodes : int
{
    ....
}

可能导致问题吗?

1 个答案:

答案 0 :(得分:5)

这两个都应该可以正常工作:

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

如果他们不这样做 - 请检查您是否在顶部有using System.Linq;,并且正在使用常规 LINQ(不像LINQBridge那样模糊不清)。

你也可以使用:

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

请注意,所有这些都假定您在T上有一个合适的通用约束,以便明确定义T.CodeType - 大概是:

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