Ключи словаря не содержат ключ, который уже содержится в ключах
Почему следующая "существующая" логическая переменная получает значение 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% битов) различия в хеш-коде
Имеет ли ваш хеш-алгоритм первое, необходимое свойство? На меня это не похоже