В заключительном разделе главы познакомимся с весьма неординарным шаблоном— словарем TDictionaryo. Словарь ОПИСан В модуле System.Generics. Collections и, как и положено любому словарю, предназначен для обслуживания пар ’’ключ — значение”, поэтому в его объявлении присутствуют два обобщенных типа^- TDictionary<TKey, TVaiue>. Ключ в словаре должен быть уникален, благодаря этому осуществляется быстрый и однозначный поиск соответствующего ему значения.
Класс вооружен несколькими конструкторами, простейший из них
constructor Create(ACapacity: Integer =0); overload;
при создании экземпляра класса в аргументах не нуждается (он создаст пустой словарь), передав в конструктор любое положительное значение. Мы заранее распределим объем словаря, чем ускорим процесс его заполнения.
Для добавления в словарь новой пары "ключ — значение” используют метод
procedure Add(const Key: TKey; const Value: TValue);
В соответствии со своим предназначением словари недолюбливают совпадение ключей, поэтому при вставке новой пары с помощью метода Add() вероятно возникновение исключительной ситуации!
Если вы намерены просто изменить значение для определенного ключа, то рекомендую процедуру
procedure AddOrSetValue(const Key: TKey; const Value: TValue);
Метод находит ключ Key и заменяет его значение на value, если же заданный ключ отсутствует, то процедура заработает как рассмотренный ранее метод Add () — добавит в словарь новую пару.
Свойства с традиционными названиями
p
roperty Count: Integer;
property Items[const Key: TKey]: TValue;
позволят соответственно узнать число элементов в словаре и получить доступ к элементу по его индексу, но заметьте, что на этот раз индекс Key универсален и может быть задан практически любым типом данных.
Изъятие из словаря пары по ключу осуществит процедура
procedure Remove(const Key: TKey);
Метод
function ExtractPair(const Key: TKey):TPair<TKey,TValue>;
также исключит пару из словаря, но на этот раз даст возможность программисту прочитать ключ/значение.
Полная очистка словаря осуществляется процедурой
procedure Clear;
Пара очень быстрых методов проверит наличие в словаре ключаfunction ContainsKey(const Key: TKey): Boolean; и значения
function ContainsValue(const Value: TValue): Boolean; и в случае успеха они возвратят true.
Для быстрого доступа к значению по его ключу вызываем функцию
function TryGetValue(const Key: TKey; out Value: TValue): Boolean;
В случае наличия в словаре пары, описываемой ключом Key, в выходной параметр value поступит соответствующее ключу значение.
Традиционное для большинства классов-шаблонов свойство
function ToArray: TArray<TPair<TKey, TValue»;
позволит представить словарь в виде массива.
Замечание
Класс TDictionary<T> в разы быстрее, чем полюбившийся многим программистам список строк TStringList! Поэтому в своих новых программах по возможности отдавайте предпочтение TDictionary<T>.