Несколько вещей:
GetHashCode
используется Словарём, чтобы выяснить, где хранить ключ внутри, но это не сценарий точного соответствия.В идеальных условиях хэш-код должен отображать каждый ключ в уникальный индекс слота, что делает поиск чрезвычайно быстрым.
На практике значения в словаре хранятся в индексе в массиве.С 2 ^ 32 различными типами хеш-кодов невозможно создать индекс массива для каждого хеш-кода, поэтому Словарь преобразует хеш-код в индекс массива, где хранятся значения.Из-за этого Словарь испытывает то, что называется "хеш-коллизиями".Это означает, что разные ключи будут отображаться на одно и то же значение хеш-функции.
Словарь справляется с этим, но в конечном итоге, когда два или более хэш-кода создают один и тот же индекс (что будет , когдаколлекция становится достаточно большой), метод Equals должен определить, какой ключ использовать для поиска пары ключ / значение, содержащей искомое значение.Если Equals имеет значение false для всех элементов в корзине, он возвращает KeyNotFoundException
, который вы испытали.
On к коду:
Хотя вы можете переопределить Equals
, я непонимаю, зачем тебе это нужноДля начала я бы избавился от твоего GetHashCode
.Со временем у вас возникнут проблемы, как показано здесь:
Dim p = new Pair(of integer, integer)(Int32.MaxValue, Int32.MaxValue)
p.gethashcode() 'BOOM!!!
Вместо этого, исходя из того, что вы здесь делаете, я бы рекомендовал вам преобразовать ваш класс Pair в struct
(Структура в VB), оставив Equals и GetHashCode в покое.Это действительно хорошая идея, если вы присваиваете паре типы значений (int, byte, bool и т. Д.) По соображениям производительности.Я бы действительно подумал об этом.
Если вам нужен класс, создайте репрезентативный ключ, который возвращает тип, подходящий для словаря.Например, поскольку KeyValuePair
является типом значения, оно будет сравниваться на основе его значения, а не ссылки.
Public Function GetKey() As KeyValuePair(Of T1, T2)
Return New KeyValuePair(Of T1, T2)(First, Second)
End Function
И ваш словарь становится
Dim Pairs as Dictionary(Of KeyValuePair(Of Integer, Integer), String)
Pairs.add(p.GetKey(), "Hello")
Console.WriteLine(Pairs(p2.GetKey()))
(Если естьлюбые синтаксические ошибки, это потому, что я не программист VB.)