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を呼び出し、デフォルトの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、期待どおりになります。StringComparison.InvariantCultureIgnoreCaseそのため、Person.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 に答える