1

次の「存在する」ブール変数の値がfalseになるのはなぜですか???

foreach (Cell existCell in this.decoratorByCell.Keys)
{   
            //this call yield the same hashcode for both cells. still exist==false
            bool exist =
                this.decoratorByCell.ContainsKey(existCell);
}

GetHashCode() & Equals() メソッドを次のようにオーバーライドしました。

public override int GetHashCode()
{
            string nodePath = GetNodePath();

            return nodePath.GetHashCode() + m_ownerColumn.GetHashCode();
}

public bool Equals(Cell other)
{
bool nodesEqual = (other.OwnerNode == null && this.OwnerNode == null) || (other.GetNodePath() == this.GetNodePath());
bool columnsEqual = (other.OwnerColumn == null && this.OwnerColumn == null) || (other.OwnerColumn == this.OwnerColumn);
bool treesEqual = (this.m_ownerTree == other.m_ownerTree);

return (nodesEqual && columnsEqual && treesEqual);
}
4

2 に答える 2

2

あなたEqualsGetHashCode実装は非常に異なることをします。それらは互いにミラーリングしている必要があります。

実装で使用していることについては言及していませんGetHashCodem_ownerTreeEquals

また、ハッシュコードを合計することは、ハッシュを計算するための最善の方法ではありません。^それらを xor ( ) アップしたい場合があります。

于 2010-04-25T11:05:05.823 に答える
1

ハッシュ アルゴリズムには、次のプロパティが必要です。

  • 2 つのものが等しい場合、それらは同じハッシュを持ちます

ハッシュ アルゴリズムには、次のプロパティが必要です

  • 可変オブジェクトを変更しても、そのハッシュ コードは変更されません
  • 速い
  • 決して例外をスローしない
  • オブジェクト間の小さな違いは、ハッシュ コードに大きな (理想的にはビットの 50%) 違いを引き起こすはずです

ハッシュ アルゴリズムには、必要な最初のプロパティがありますか? 私にはそう見えません。

于 2010-04-25T14:32:43.063 に答える