Проблема с GetHashCode - PullRequest
       28

Проблема с GetHashCode

2 голосов
/ 13 октября 2009

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

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

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

Ответы [ 4 ]

6 голосов
/ 13 октября 2009

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

3 голосов
/ 13 октября 2009

Ну, я бы хотел взглянуть на пару вещей:

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
1 голос
/ 13 октября 2009

ОК, это длинный выстрел.

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

0 голосов
/ 13 октября 2009

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

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

int GetHashcode()
{
  return 0;
}
...