在C#中,List<T>.Contains 方法用于确定列表是否包含特定元素。对于引用类型的对象(如自定义类的实例),默认情况下 Contains 使用的是对象引用的比较,而不是对象内容的比较。
这意味着,如果你有多个对象,即使它们的内容完全相同,但它们是不同的实例(即有不同的引用),那么 Contains 将不会认为它们相等。
例如:
Csharp
深色版本
public class Person
{
public string Name { get; set; }
}
Person person1 = new Person { Name = "John" };
Person person2 = new Person { Name = "John" };
List<Person> people = new List<Person>();
people.Add(person1);
bool contains = people.Contains(person2); // 这里会返回 false
在这个例子中,person1 和 person2 有着相同的属性值,但是它们是两个不同的实例,所以 Contains 返回 false。
如果你想要根据对象的内容来判断是否包含,你需要重写 Equals 和 GetHashCode 方法,或者你可以传递一个自定义的 IEqualityComparer<T> 给 Contains 方法。
下面是如何通过重写 Equals 和 GetHashCode 来实现基于内容的比较的例子:
Csharp
深色版本
public class Person : IEquatable<Person>
{
public string Name { get; set; }
public override bool Equals(object obj)
{
return Equals(obj as Person);
}
public bool Equals(Person other)
{
if (other == null)
return false;
return this.Name == other.Name;
}
public override int GetHashCode()
{
return (Name != null ? Name.GetHashCode() : 0);
}
}
// 现在使用 Contains 方法将会比较对象的内容:
Person person1 = new Person { Name = "John" };
Person person2 = new Person { Name = "John" };
List<Person> people = new List<Person>();
people.Add(person1);
bool contains = people.Contains(person2); // 这里会返回 true
请注意,当重写了 Equals 方法时,通常也应该重写 GetHashCode 方法,以确保对象在哈希表(如字典或集合)中的行为正确。如果两个对象被认为是相等的(Equals 返回 true),那么它们的哈希代码也应该是相同的。