3

我有以下简单的课程

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 并传递默认的平等比较器,这是由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,结果符合预期。所以在我看来,好像StringComparison.InvariantCultureIgnoreCasePerson.Equals方法中被忽略了。

有人有想法吗?

4

2 回答 2

3

您现在需要GetHashCode()*sensitive Hash Code 中获取 case-* ,这将是大写和小写的不同哈希码。Name

例如:

public override int GetHashCode() 
{ 
    return Name.ToUpperInvariant().GetHashCode(); 
} 
于 2012-08-06T12:09:02.237 回答
2

您的 GetHashCode() 将为应该被视为相同的对象返回不同的哈希码。

于 2012-08-06T12:08:38.747 回答