【问题标题】:What's the best way to re-index a TDictionary?重新索引 TDictionary 的最佳方法是什么?
【发布时间】:2019-09-27 15:06:05
【问题描述】:

我有一个TObjectDictionary<Integer, TMyObject>,而TMyObject 有一个ID 字段,这是关键。字典拥有这些值。键最初来自序列生成器,因此当删除和插入发生时,键值在字典中变得不连续,我需要它们是连续的。我可以将所有对象拉入一个单独的TList,重新编号它们的IDs,清除字典并使用它们现在的顺序键重新添加对象,但这似乎非常不雅。有一个更好的方法吗?

另外,我如何告诉TObjectDictionary 它不再拥有它的值?

【问题讨论】:

  • 如果要通过连续整数值标识项目,那么字典肯定是错误的集合。您不想将它们保存在列表或数组中吗?

标签: delphi tdictionary


【解决方案1】:

如果可以从值中检索密钥,那么将其存储在 TDictionary 中可能不是最好的主意,因为当它们的密钥属性更改时,您无法轻松地重新散列所有项目。再加上您只能使用 ExtractPair 来保持字典所拥有的对象处于活动状态,这是非常无效的,或者是破解私有 FOwnerships 字段的方式。

由于 key/id 来自序列生成器,因此插入顺序可能恰好是按递增顺序排列的,这可能是将项目放入列表并保持按 ID 排序的指示符。然后可以通过二分查找来完成查找。

除非您喜欢并实现自己的搜索树来满足您的任何要求。

【讨论】:

    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    相关资源
    最近更新 更多