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

10

我能否在TDictionary中更改键而不更改值呢?

为了解释,我使用的是TObjectDictionary,它是从Delphi XE Generics.Collections单元中的TDictionary派生而来。这很好,但是我还需要能够更改存储的对象的键值。

我的第一次尝试如下:

MyObject := MyDictionary.Items[OldKeyValue];
MyDictionary.Remove(OldKeyValue);
MyDictionary.Add(NewKeyValue, MyObject);
这样做的问题在于Remove()导致对象被释放。我尝试使用AddOrSetValue将值先更改为nil,但这也会释放对象。既然已经告诉字典它拥有它们,那就没关系了。然而,TObjectDictionary中没有额外的函数可以在不释放的情况下移除对象,所以我尝试在不修改值的情况下更改字典中的键。然而在Delphi XE帮助文件中没有看到任何可以实现这个目的的东西。这可能是可能的吗?如果不行,我就得回去使用一个字典并自己释放所有内容。
1个回答

20

调用 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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接