まず、ここでGetHashCode
説明するアルゴリズムを使用しています。ここで、次の(考案された)例を想像してください。
class Foo
{
public Foo(int intValue, double doubleValue)
{
this.IntValue = intValue;
this.DoubleValue = doubleValue;
}
public int IntValue { get; private set; }
public double DoubleValue { get; private set; }
public override int GetHashCode()
{
unchecked
{
int hash = 17;
hash = hash * 23 + IntValue.GetHashCode();
hash = hash * 23 + DoubleValue.GetHashCode();
return hash;
}
}
}
class DerivedFoo : Foo
{
public DerivedFoo(int intValue, double doubleValue)
: base(intValue, doubleValue)
{
}
}
各プロパティに同じ値のaFoo
とaがある場合DerivedFoo
、それらは同じハッシュコードを持ちます。HashSet<Foo>
つまり、Linqでこのメソッドを使用することも、使用することもできDistinct
、2つのインスタンスは同じものとして扱われます。
私はおそらくの使用法を誤解しているだけですGetHashCode
が、これら2つのインスタンスは異なるハッシュコードを持っていると思います。これは無効な期待GetHashCode
ですか、それとも計算でタイプを使用する必要がありますか?(またはDerivedClass
オーバーライドする必要がありますGetHashCode
)?
PSこのトピックに関連して、SOに関する質問がたくさんあることはわかっていますが、この質問に直接答える質問は見つかりませんでした。