字典键不包含已包含在键中的键

时间:2010-04-25 10:54:42

标签: c# dictionary key gethashcode equals-operator

为什么以下'存在'布尔变量的值为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 个答案:

答案 0 :(得分:2)

您的EqualsGetHashCode实施做了很多不同的事情。他们应该互相镜像。

您在GetHashCode实施中m_ownerTree未提及Equals

此外,添加哈希码并不是计算哈希的麻烦方式。您可能想要对它们进行xor(^)。

答案 1 :(得分:1)

哈希算法必须具有以下属性:

  • 如果两件事情相等,那么他们就有相同的哈希

哈希算法应该具有以下属性:

  • 更改可变对象不会更改其哈希码
  • 永远不会抛出异常
  • 对象之间的微小差异应该导致哈希码中的大量(理想情况下为50%的位)差异

您的哈希算法是否具有第一个必要的属性?它看起来并不像我这样。