Как я могу изменить значение ключа в Delphi TDictionary или TObjectDictionary? - PullRequest
9 голосов
/ 08 апреля 2011

Могу ли я изменить ключ в TDictionary без изменения значения?

Чтобы объяснить, я использую TObjectDictionary, который является производным от TDictionary в модуле Delphi XE Generics.Collections. Это все хорошо, за исключением того, что мне также нужно иметь возможность изменять значение ключа для сохраняемого объекта.

Моя первая попытка выглядит следующим образом:

MyObject := MyDictionary.Items[OldKeyValue];
MyDictionary.Remove(OldKeyValue);
MyDictionary.Add(NewKeyValue, MyObject);

Проблема в том, что при удалении () объект освобождается. Я попытался сделать AddOrSetValue, чтобы сначала изменить значение на nil, но это тоже Free - объект. Так как я сказал словарю, что он владеет ими, это достаточно справедливо. Хотя в TObjectDictonary нет дополнительной функции, которую можно удалить без Free, поэтому я перехожу к попытке изменить ключ в словаре без изменения значения. Однако я не вижу ничего похожего на это в справке Delphi XE. Это вообще возможно? Если нет, я вернусь к использованию словаря и сам все освободлю.

1 Ответ

19 голосов
/ 08 апреля 2011

Позвоните TDictionary<TKey,TValue>.ExtractPair(const Key: TKey), и вы получите ключ и значение, но значение не будет освобождено.Затем вы можете добавить его обратно с другим ключом.

Метод ExtractPair() возвращает TPair<TKey,TValue>, который представляет собой просто запись, содержащую ключ и соответствующее значение.

Код можетвыглядеть примерно так:

type
  TMyKey = string;
  TMyValue = TMyObject;

procedure ChangeKey(dict: TDictionary<TMyKey,TMyValue>; OldKey, NewKey: TMyKey);
var
  Pair: TPair<TMyKey,TMyValue>;
begin
  Pair := dict.ExtractPair(OldKey);
  dict.Add(NewKey, Pair.Value);
end;
...