2010-04-25 167 views
1

爲什麼以下'exist'布爾變量的值爲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); 
} 

回答

2

EqualsGetHashCode實現做完全不同的事情。他們應該互相鏡像。

您在GetHashCode中沒有提及您在Equals實施中使用的m_ownerTree

另外,將哈希碼相加並不是計算哈希的最簡單的方式。你可能想要把它們(^)向上。

1

的哈希算法必須具有以下屬性:

  • 如果兩件事情是相等的,那麼它們具有相同的哈希

散列算法應該具有以下屬性:

  • 更改可變對象不會更改其哈希碼
  • 快速
  • 從未拋出異常對象之間
  • 小的差異應引起大(位的理想50%)的哈希碼的差異

請問您的哈希算法有第一,必要的財產?它不像我這樣看待我。

+0

.NET框架文檔實際上有一個更好的描述它必須做什麼,並澄清你的#1應該做的情況下:http://msdn.microsoft.com/en-us/library/system.object.gethashcode的.aspx – jasonh 2010-04-25 15:59:45