使用List<T>.Contains(...)是可行的吗?

9

我正在尝试创建一个通用的缓存类,它将保存一系列对象,并公开一种方法,该方法可以基于Id属性检查对象实例是否已经被缓存:

public class CacheService<T> where T : BaseModel
{
    private List<T> _data = new List<T>();

    public void Check(T obj)
    {
        if (_data.Contains(r => r.Id.Equals(obj.Id))
        {
            //Do something
        }
    }
}

public class BaseModel 
{
    public int Id { get; set; }
}

Contains()命令中,我遇到了编译器错误,错误提示如下:

无法将lambda表达式转换为类型“T”,因为它不是委托类型

我该怎么做才能实现我的目标呢?


3
Contains 接受一个可能的元素来搜索,而不是一个谓词 - Eric Lippert
2个回答

24
你可以使用 Linq:
bool contains = _data.Any(r => r.Id.Equals(obj.Id));

或者使用List.Exists

bool contains = _data.Exists(r => r.Id.Equals(obj.Id));

2
好的Exists函数调用 - 我忘记了它。 - Jon Skeet
谢谢!Any()解决了我的问题。但是,Exists()在我的自动完成列表中不存在。它存在于哪个命名空间中? - Liel
@Liel:List.ExistsList<T>中一个旧的.NET 2方法(链接如上)。因此它应该是可见的。 - Tim Schmelter
显然,我看不到Exists()扩展的原因是我正在编写一个具有 .NET 子集的 PCL 库。感谢您的帮助。 - Liel

4

使用 LINQ 函数 Any 替换 Contains。对于 List<T>Contains 方法被定义为接受一个 T


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接