Ключи словаря не содержат ключ, который уже содержится в ключах - PullRequest
1 голос
/ 25 апреля 2010

Почему следующая логическая переменная «существовать» получает значение 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 ]

2 голосов
/ 25 апреля 2010

Ваши реализации Equals и GetHashCode делают очень разные вещи. Они должны отражать друг друга.

Вы не упомянули в GetHashCode о m_ownerTree, который вы используете в своей реализации Equals.

Кроме того, добавление хеш-кодов не является лучшим способом вычисления хеш-кода. Вы можете хотеть xor их (^) вверх.

1 голос
/ 25 апреля 2010

Алгоритм хеширования должен иметь следующее свойство:

  • если две вещи равны, то они имеют одинаковый хэш

Алгоритм хеширования должен иметь следующие свойства:

  • изменение изменяемого объекта не меняет его хеш-код
  • быстро
  • никогда не выбрасывать исключение
  • небольшие различия между объектами должны вызывать большие (в идеале 50% битов) различия в хеш-коде

Имеет ли ваш хеш-алгоритм первое, необходимое свойство? Это не выглядит так, как я.

...