Просто чтобы понять: Существует одна важная вещь, о Dictionary<TKey, TValue>
и GetHashCode()
: Словарь использует GetHashCode, чтобы определить, если два ключа равны, т.е. если <TKey>
имеет пользовательского типа, вы должны заботиться о тщательно реализации GetHashCode()
. Как заметил Эндрю Харе, это легко, если у вас есть простой тип, который однозначно идентифицирует ваш пользовательский объект. Если у вас есть комбинированный идентификатор, он становится немного сложнее.
В качестве примера рассмотрим комплексное число как TKey
. Комплексное число определяется его реальным и его мнимой частью. Оба имеют простой тип, например. double
. Но как бы вы определили, равны ли два комплексных числа? Вы реализуете GetHashode()
для своего настраиваемого сложного типа и объединяете обе идентифицирующие части.
Дальнейшее чтение по последнему here.
UPDATE
Основываясь на комментарий Ergwun, я проверил поведение Dictionary<TKey, TValue>.Add
с особым уважением к TKey
«s реализации Equals(object)
и GetHashCode()
. I должен признаться, что я был очень удивлен результатами.
Указанные два объекта k1
и k2
типа TKey
, две произвольные объекты v1
и v2
типа TValue
и пустой словарь d
типа Dictionary<TKey, TValue>
, это то, что происходит при добавлении v1
с ключом k1
к d
первой и v2
с ключом k2
второй (в зависимости от реализации TKey.Equals(object)
и TKey.GetHashCode()
):
k1.Equals(k2) k1.GetHashCode() == k2.GetHashCode() d.Add(k2, v2)
false false ok
false true ok
true false ok
true true System.ArgumentException
Con clusion: Я был не прав, поскольку я изначально думал, что второй случай (где Equals
возвращает false
, но оба ключевых объекта имеют один и тот же хеш-код) поднимут ArgumentException
. Но поскольку третий случай показывает словарь каким-то образом, он использует GetHashCode()
. Во всяком случае, кажется хорошим советом, что два объекта одного типа и равны должны возвращать один и тот же хэш-код, чтобы убедиться, что экземпляры Dictionary<TKey, TValue>
работают правильно.
Возможный дубликат [Почему важно переопределить GetHashCode, когда метод Equals переопределен?] (Http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when- equals-method-is-overridden) – nawfal