【问题标题】:How can I change the Key value in a Delphi TDictionary or TObjectDictionary?如何更改 Delphi TDictionary 或 TObjectDictionary 中的键值?
【发布时间】:2011-08-01 12:49:33
【问题描述】:

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

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

我的第一次尝试如下:

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

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

【问题讨论】:

    标签: delphi delphi-xe


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      相关资源
      最近更新 更多