Linq-to-Sqlを使用してSQLServerデータベースにクエリを実行しています。このクエリは、データベース内のエンティティのリストを返します。基になるデータは変更されていません。
リストを受け取ったら、同等性をテストするためにリストでGetHashCodeを呼び出します。奇妙なことに、ハッシュ値は常に異なります。なぜそれはいつも違うのでしょうか?
ありがとうございました、
それらは異なるオブジェクト参照であるため、異なります。
そのように動作させたい場合は、オブジェクト データに基づいて、オブジェクトのEquals()とGetHashCode()をオーバーライドする必要があります。
ここにそれを行う方法の例があり、ここにメソッドをオーバーライドするガイドラインに関するブログ投稿がありますGetHashCode()
。それが役に立てば幸い。
class TwoDPoint : System.Object
{
public readonly int x, y;
public TwoDPoint(int x, int y)
{
this.x = x;
this.y = y;
}
public override bool Equals(System.Object obj)
{
if (obj == null) return false;
TwoDPoint p = obj as TwoDPoint;
if (p == null) return false;
// Return true if the fields match
return (x == p.x) && (y == p.y);
}
public override int GetHashCode()
{
return x ^ y;
}
}
Servyがコメントで述べたように、メソッドをオーバーライドしてもGetHashCode()
、そのタイプのデータで衝突のないハッシュを作成することはできず、衝突率を下げることしかできないことに注意してください。Equals()
同じハッシュを持つオブジェクトが本当に同じであることを確認するために使用する必要があります
オーバーライドしましたGetHashCode()
か?そうでない場合、デフォルトの実装では、リストの参照に基づいてハッシュ コードを提供します。リストの内容とは関係ありません。
したがって、2 つの異なるインスタンスは、2 つの異なるハッシュ コードを意味します。
エンティティ クラスでリストの等価性オーバーライドEquals
(および) を確認し、リストで使用します。GetHashCode()
SequenceEqual