好吧,对于您的场景,您应该在类上使用该Contains
方法。List
那么你可能会问,存在的目的是什么?好吧,该Contains
方法使用Equals
对象上的方法来确定您正在检查的项目是否包含在列表中。这仅在类重写了Equals
相等检查的方法时才有效。如果没有,那么您认为相等的事物的两个单独实例将不被视为相等。
除此之外,也许您想使用该Equals
方法提供的不同逻辑。现在,确定列表中是否存在某些内容的唯一方法是自己迭代它,或者编写自己的 EqualityComparer 来检查实例的相等性。
因此,列表类所做的是公开一些方法,Exists
以便您可以轻松地提供自己的逻辑,同时为您进行样板迭代。
例子
考虑您有一个Dog
类型列表。现在,狗类已经覆盖了该Equals
方法,所以没有办法检查一只狗是否与另一只狗相等,但他们有一些关于狗的信息,比如它的名字和主人。所以考虑以下
List<Dog> dogs = new List<Dog> {
new Dog { Name = "Fido", Owner = "Julie" },
new Dog { Name = "Bruno", Owner = "Julie" },
new Dog { Name = "Fido", Owner = "George" }
};
Dog fido = new Dog { Name = "Fido", Owner = "Julie" };
List.Contains(fido)
- 返回 false(因为
Equals
方法尚未被覆盖)
List.Exists(x => fido.Name == x.Name && fido.Owner == x.Owner)
- 返回 true,因为您正在检查属性的相等性,这些属性是字符串,具有相等性覆盖。
如果您要查看列表类的源代码,您可能会看到类似这样的内容。
public bool Exists(Predicate<Dog> predicate) {
foreach (Dog item in Items) {
if (predicate(item))
return true;
}
return false;
}
现在,如果您填写我上面的谓词,该方法将如下所示
public bool Exists(Dog other) {
foreach (Dog item in Items) {
if (item.Name == other.Name && item.Owner == other.Owner)
return true;
}
return false;
}