Введенный в Delphi 2009, Класс TDictionary, определенный в Обобщениях. Единица коллекций, представляет собой общую коллекцию типов пар хэш-таблиц.
Общие типы, также представленный в Delphi 2009, позволяет вам определять классы, которые не определяют тип элементов данных.
Словарь в некотором роде похож на массив. В массив вы работаете с серией (коллекцией) значений, проиндексированных целочисленным значением, которое может быть любым порядковый тип. Этот индекс имеет нижнюю и верхнюю границу.
В словаре вы можете хранить ключи и значения, где любой может быть любого типа.
Конструктор TDictionary
Отсюда и объявление конструктора TDictionary:
В Delphi TDictionary определяется как хеш-таблица. Хеш-таблицы представляют собой набор пар ключ-значение, которые организованы на основе хэш-кода ключа. Хеш-таблицы оптимизированы для поиска (скорость). Когда пара ключ-значение добавляется в хэш-таблицу, хэш ключа вычисляется и сохраняется вместе с добавленной парой.
TKey и TValue, потому что они дженерики, могут быть любого типа. Например, если информация, которую вы хотите сохранить в словаре, поступает из какой-либо базы данных, ваш ключ может быть GUID (или какое-то другое значение, представляющее уникальный индекс), в то время как значение может быть объектом, сопоставленным со строкой данных в вашей базе данных столы.
Использование TDictionary
Для простоты в примере ниже используются целые числа для TKeys и символы для TValues.
Во-первых, мы объявляем наш словарь, указывая типы TKey и TValue:
Затем словарь заполняется с помощью метода Add. Поскольку в словаре не может быть двух пар с одним и тем же значением ключа, вы можете использовать метод ContainsKey, чтобы проверить, находится ли какая-либо пара со значением ключа внутри словаря.
Чтобы удалить пару из словаря, используйте метод Remove. Этот метод не вызовет проблем, если пара с указанным ключом не является частью словаря.
Чтобы пройти все пары, пройдя по клавишам, вы можете сделать для в петле.
Используйте метод TryGetValue, чтобы проверить, включена ли какая-либо пара ключ-значение в словарь.
Сортировка словаря
Поскольку словарь является хеш-таблицей, он не хранит элементы в определенном порядке сортировки. Чтобы перебрать ключи, отсортированные в соответствии с вашими потребностями, воспользуйтесь TList - универсальным типом коллекции, который поддерживает сортировку.
Приведенный выше код сортирует ключи по возрастанию и убыванию и получает значения, как если бы они были сохранены в отсортированном порядке в словаре. Сортировка значений ключа целочисленного типа по убыванию использует TComparer и анонимный метод.
Когда ключи и значения имеют тип TObject
Приведенный выше пример является простым, потому что и ключ, и значение являются простыми типами. У вас могут быть сложные словари, в которых ключ и значение являются «сложными» типами, такими как записи или объекты.
Вот еще один пример:
Здесь для ключа используется пользовательская запись, а для значения используется пользовательский объект / класс.
Обратите внимание на использование специализированного TObjectDictionary класс здесь. TObjectDictionary может обрабатывать время жизни объектов автоматически.
Значение ключа не может быть равно нулю, а значение значения может быть.
Когда создается экземпляр TObjectDictionary, параметр Ownerships указывает, владеет ли словарь ключами, значениями или обоими, и, следовательно, помогает избежать утечек памяти.