Проблема с GetHashCode

2

Может ли кто-нибудь помочь объяснить следующее. У меня проблема с Словарем, где ContainsKey оценивается как false, а Equals и GetHashCode для объектов успешно. Ниже приведен вывод из непосредственного окна в Visual Studio:

?LocationToRackingGroup.Keys.ToArray()[23].Equals(location)
true
?LocationToRackingGroup.Keys.ToArray()[23] == (location)
true
?this.LocationToRackingGroup.ContainsKey(location)
false

Я что-то упустил? Любые идеи очень ценятся.

Теги:
equals
hashcode

4 ответа

6
Лучший ответ

Изменено ли местоположение? Потому что, если это так, возможно, это изменилось с тех пор, как вы поместили его в словарь.

  • 0
    О, очень верно - хорошее место; частая причина боли.
3

Хорошо, я хотел бы посмотреть на пару вещей:

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
  • 0
    Спасибо за быстрый ответ: 1. GetHashCode одинаково для обоих, я хотел включить это извините: IEquatable явно, но только что попробовал, и это не имеет значения, я боюсь. 3. Я не думаю, что это должно иметь значение. Если я прав, он должен использовать IEqualityComparer Equals по умолчанию, который был переопределен. Есть другие идеи?
  • 0
    Вы смотрели на ответ Роберта? Кроме этого, нам, вероятно, понадобится что-нибудь воспроизводимое.
1

ОК, это длинный снимок.

В первых двух строках вы ссылаетесь на LocationToRackingGroup и в последнем случае на this.LocationToRackingGroup, являются ли они одной и той же переменной?

0

Правило заключается в том, что хэш-код должен быть одинаковым для каждого "экземпляра" одних и тех же данных. Если он изменится, ваша хеш-функция будет нарушена.

IOW, самая безопасная хеш-функция:

int GetHashcode()
{
  return 0;
}
  • 0
    Это отрицает полезность метода хэш-кода, но технически является юридической реализацией; может быть полезно попробовать это для отладки

Ещё вопросы

Сообщество Overcoder
Наверх
Меню