Допустим, есть класс, у которого есть 2 цифровых поля.
Хотелось бы эти 2 поля сделать первичным ключем в Dictionary.
В будущем этот ключ будет использоваться для поиска совпавших значений между 2 мя словарями.
Как это можно сделать, что бы не потерять в производительности?
У меня была идея, хранить их как строку, но может быть есть решение лучше?
P.S
Dictionary использую из-за высокой скорости поиска по ключу.
К моему удивлению, DataTable оказался тормознутее=( на 20к строк
Как один из вариантов
Можно использовать класс Tuple. Например Dictionary<Tuple<T1,T2>, T3>
,
где T1, T2, T3 значения любых типов. В Tuple
сравниваться будет по
внутренним значениям.
у Tuple переопределены методы GetHashCode и Equals © Grundy
IEqualityComparer<T>
в конструктор, где Т - тип ключа. Сравнение будет производиться с использованием компаратора.Есть несколько путей использовать составной ключ для Dictionary (аналогично для HashSet)
Использовать структуру. Правила сравнения структур таковы, что сравниваются значения всех полей, а не ссылки на объекты.
Использовать класс с переопределенными методами Equals
, GetHashCode
. Это позволит использовать для вычисления хэша не все поля класса, а только нужные.
Использовать класс реализующий IEquatable<T>
Использовать при создании словаря перегрузку конструктора принимающую IEqualityComparer<T>
Вероятно, Tuple
подойдёт для использования в качестве ключа.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Работаю с Microsoft DAO 36 Object Library, так как он производительнее ADO
Пытаюсь разобраться как написать процесс сжатия и разжатия при помощи GZip в многопоточной среде
Как в ASPNET MVC ссылку вложить элемент, сохраняя при этом виртуальный путь?