我有以下简单类
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; }
}
现在我正在创建一个人数组,在它们上调用distinct并传递默认的Equality Comparer,这是IEquatable<Person>
实现的那个
var persons = new[] {new Person("foo"), new Person("Foo"), new Person("bar"), new Person("Bar")};
persons.Distinct(EqualityComparer<Person>.Default);
当我检查有区别的人时,我期待IEnumerable<Person>
包含foo, bar
。但是内容为foo, Foo, bar, Bar
当我使用foo, foo, bar, bar
初始化List时,结果与预期一致。所以在我看来,StringComparison.InvariantCultureIgnoreCase
方法中的Person.Equals
被忽略了。
有人有想法吗?
答案 0 :(得分:3)
此刻,您需要在 *敏感的哈希代码中GetHashCode()
获取案例 - * ,它将是大写和小写Name
的不同哈希码的。
例如:
public override int GetHashCode()
{
return Name.ToUpperInvariant().GetHashCode();
}
答案 1 :(得分:2)
您的GetHashCode()将为应被视为相同的对象返回不同的哈希码。