Составной ключ в Dictionary

425
28 января 2017, 08:27

Допустим, есть класс, у которого есть 2 цифровых поля.

Хотелось бы эти 2 поля сделать первичным ключем в Dictionary.

В будущем этот ключ будет использоваться для поиска совпавших значений между 2 мя словарями.

Как это можно сделать, что бы не потерять в производительности?

У меня была идея, хранить их как строку, но может быть есть решение лучше?

P.S

Dictionary использую из-за высокой скорости поиска по ключу.

К моему удивлению, DataTable оказался тормознутее=( на 20к строк

Answer 1

Как один из вариантов

  • Можно использовать класс Tuple. Например Dictionary<Tuple<T1,T2>, T3>, где T1, T2, T3 значения любых типов. В Tuple сравниваться будет по внутренним значениям.

    у Tuple переопределены методы GetHashCode и Equals © Grundy

  • Использовать структуру, т.к. у структур идет сравнение по всем имеющимся полям
  • Передавать IEqualityComparer<T> в конструктор, где Т - тип ключа. Сравнение будет производиться с использованием компаратора.
Answer 2

Есть несколько путей использовать составной ключ для Dictionary (аналогично для HashSet)

  1. Использовать структуру. Правила сравнения структур таковы, что сравниваются значения всех полей, а не ссылки на объекты.

  2. Использовать класс с переопределенными методами Equals, GetHashCode. Это позволит использовать для вычисления хэша не все поля класса, а только нужные.

  3. Использовать класс реализующий IEquatable<T>

  4. Использовать при создании словаря перегрузку конструктора принимающую IEqualityComparer<T>

Answer 3

Вероятно, Tuple подойдёт для использования в качестве ключа.

READ ALSO
Правильная работа с COM объектами в .NET

Правильная работа с COM объектами в .NET

Работаю с Microsoft DAO 36 Object Library, так как он производительнее ADO

431
C#. Разжатие файла при помощи GZip в многопоточной среде

C#. Разжатие файла при помощи GZip в многопоточной среде

Пытаюсь разобраться как написать процесс сжатия и разжатия при помощи GZip в многопоточной среде

515
Вложить в ссылку элемент

Вложить в ссылку элемент

Как в ASPNET MVC ссылку вложить элемент, сохраняя при этом виртуальный путь?

390