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

如何更改Delphi TDictionary或TObjectDictionary中的键值?,delphi,delphi-xe,Delphi,Delphi Xe,我可以在不更改值的情况下更改t字典中的键吗 为了解释,我使用了一个TObjectDictionary,它来自Delphi XE Generics.Collections单元中的TDictionary。这一切都很好,只是我还需要能够更改存储的对象的键值 我的第一次尝试如下: MyObject := MyDictionary.Items[OldKeyValue]; MyDictionary.Remove(OldKeyValue); MyDictionary.Add(NewKeyValue, MyOb

我可以在不更改值的情况下更改t字典中的键吗

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

我的第一次尝试如下:

MyObject := MyDictionary.Items[OldKeyValue];
MyDictionary.Remove(OldKeyValue);
MyDictionary.Add(NewKeyValue, MyObject);
问题是Remove()导致对象被释放。我尝试先使用AddOrSetValue将值更改为nil,但对象太自由了。既然我已经告诉字典它拥有它们,这就足够公平了。虽然TobjectDictionary中没有额外的函数可以在没有Free的情况下删除,因此我转而尝试在不更改值的情况下更改字典中的键。但是,在Delphi XE帮助中,我看不到任何类似的东西。这可能吗?如果没有,我将继续使用字典并自己释放它。

调用
TDictionary.ExtractPair(const Key:TKey)
您将获得键和值,但值不会被释放。然后可以使用不同的键将其添加回

ExtractPair()
方法返回一个
TPair
,它只是一个包含键及其关联值的记录

代码可能如下所示:

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;
类型
TMyKey=字符串;
TMyValue=TMyObject;
程序更改键(dict:t字典;OldKey,NewKey:TMyKey);
变量
配对:TPair;
开始
Pair:=dict.ExtractPair(OldKey);
dict.Add(NewKey,Pair.Value);
结束;