我有一个简单的类如下所示:
public class Person : IEquatable<Person>
{
public bool Equals(Person other)
{
return Name.Equals(other.Name, StringComparison.InvariantCultureIgnoreCase);
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
public Person(string name)
{
Name = name;
}
public string Name { get; set; }
}
现在我正在创建一个人员数组,对其进行去重,并使用默认的相等比较器进行传递,这个比较器是由 IEquatable<Person>
实现的。
var persons = new[] {new Person("foo"), new Person("Foo"), new Person("bar"), new Person("Bar")};
persons.Distinct(EqualityComparer<Person>.Default);
当我检查不同的人时,我期望得到一个包含“foo,bar”的IEnumerable<Person>。然而,内容是“foo,Foo,bar,Bar”。
当我使用“foo,foo,bar,bar”初始化列表时,结果符合预期。因此,我认为在Person.Equals方法中的StringComparison.InvariantCultureIgnoreCase被忽略了。
有人有想法吗?
Equals
中检查other
是否为null
。由于Person
可能是从中派生的(它不是一个sealed
类),还要考虑说if (GetType() != other.GetType()) { return false; }
。请注意,你的对象是可变的(Name
可以在对象构造后更改),而可变对象不应在字典或哈希集合中被修改。通过说return obj as Person;
来覆盖虚拟的Object.Equals(object obj)
方法。 - Jeppe Stig Nielsen