Может ли кто-нибудь помочь объяснить следующее. У меня проблема с Словарем, где ContainsKey
оценивается как false, а Equals
и GetHashCode
для объектов успешно. Ниже приведен вывод из непосредственного окна в Visual Studio:
?LocationToRackingGroup.Keys.ToArray()[23].Equals(location)
true
?LocationToRackingGroup.Keys.ToArray()[23] == (location)
true
?this.LocationToRackingGroup.ContainsKey(location)
false
Я что-то упустил? Любые идеи очень ценятся.
Изменено ли местоположение? Потому что, если это так, возможно, это изменилось с тех пор, как вы поместили его в словарь.
Хорошо, я хотел бы посмотреть на пару вещей:
1: GetHashCode
правильно реализовано:
?LocationToRackingGroup.Keys.ToArray()[23].GetHashCode() == location.GetHashCode()
2: если это общий словарь, реализует ли этот тип (явно) IEquatable<Location>
3: вы добавили пользовательский IEqualityComparer<Location>
в словарь в конструкторе?
Чтобы исключить последнее, возможно, посмотрите на:
?LocationToRackingGroup.Comparer.Equals(blah23, location); // should be true
?LocationToRackingGroup.Comparer.GetHashCode(blah23); // should equal below
?LocationToRackingGroup.Comparer.GetHashCode(location);// should equal above
ОК, это длинный снимок.
В первых двух строках вы ссылаетесь на LocationToRackingGroup
и в последнем случае на this.LocationToRackingGroup
, являются ли они одной и той же переменной?
Правило заключается в том, что хэш-код должен быть одинаковым для каждого "экземпляра" одних и тех же данных. Если он изменится, ваша хеш-функция будет нарушена.
IOW, самая безопасная хеш-функция:
int GetHashcode()
{
return 0;
}