Просто чтобы прояснить: есть одна важная вещь о Dictionary<TKey, TValue>
и GetHashCode()
: Словарь использует GetHashCode, чтобы определить, равны ли два ключа, т.е. если <TKey>
имеет пользовательский тип, вам следует позаботиться о реализации GetHashCode()
внимательно. Как отметил Эндрю Хэйр, это легко, если у вас есть простой тип, который однозначно идентифицирует ваш пользовательский объект. Если у вас есть комбинированный идентификатор, он становится немного сложнее.
В качестве примера рассмотрим комплексное число как TKey
. Комплексное число определяется его действительной и мнимой частью. Оба имеют простой тип, например double
. Но как бы вы определили, если два комплексных числа равны? Вы реализуете GetHashode()
для своего пользовательского сложного типа и объединяете обе идентифицирующие части.
Более подробную информацию о последних вы найдете здесь .
UPDATE
На основании комментария Эргвуна я проверил поведение Dictionary<TKey, TValue>.Add
с особым уважением к реализации TKey
Equals(object)
и GetHashCode()
. я
Должен признаться, что я был довольно удивлен результатами.
Учитывая два объекта k1
и k2
типа TKey
, два произвольных объекта v1
и v2
типа TValue
и пустой словарь d
типа Dictionary<TKey, TValue>
, это что происходит при добавлении v1
с ключом k1
к d
first и v2
с ключом k2
second (в зависимости от реализации 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
Вывод: я ошибся, так как изначально думал, что второй случай (где Equals
возвращает false
, но оба ключевых объекта имеют одинаковый хэш-код) вызовет ArgumentException
. Но в третьем случае словарь каким-то образом использует GetHashCode()
. В любом случае, хороший совет - два объекта одинакового типа и одинакового типа должны возвращать один и тот же хэш-код, чтобы гарантировать правильную работу экземпляров Dictionary<TKey, TValue>
.