如何更改Delphi TDictionary或TObjectDictionary中的Key值?

mj2*_*008 9 delphi delphi-xe

我可以在不更改值的情况下更改TDictionary中的键吗?

为了解释,我使用的是TObjectDictionary,它源自Delphi XE Generics.Collections单元中的TDictionary.这一切都很好,除了我还需要能够更改存储的对象的键值.

我的第一次尝试如下:

MyObject := MyDictionary.Items[OldKeyValue];
MyDictionary.Remove(OldKeyValue);
MyDictionary.Add(NewKeyValue, MyObject);
Run Code Online (Sandbox Code Playgroud)

这个问题是Remove()导致对象被释放.我尝试使用AddOrSetValue将值更改为nil,但这也是Free的对象.既然我已经告诉它拥有它们的字典,这是公平的.虽然TObjectDictonary中没有额外的功能可以在没有Free的情况下删除,所以我因此尝试在不改变值的情况下更改字典中的Key.但是我无法在Delphi XE帮助中看到任何看起来会这样做的内容.这有可能吗?如果没有,我会回到使用字典并自己释放它.

Dav*_*nan 19

调用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;
Run Code Online (Sandbox Code Playgroud)