Ключи словаря не содержат ключ, который уже содержится в ключах

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

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

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

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

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

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

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

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

Имеет ли ваш хеш-алгоритм первое, необходимое свойство? На меня это не похоже

Другие вопросы по тегам