【问题标题】:Using TTime as the key of a TDictionary使用 TTime 作为 TDictionary 的键
【发布时间】:2012-11-02 19:38:00
【问题描述】:

我想使用TTime 作为TDictionary 的键,但我遇到了TTime 比较的问题,因此我正在寻找替代方法。

我的特殊问题是,我正在尝试构建某种议程,同时将时间放在一边,用 TTime 对象表示,并将它们存储在 TDictionary 旁边的顶部坐标中。鉴于我想在网格上绘制任务的时间,我可以根据任务的时间轻松地从字典中检索其顶部坐标。不幸的是,它不起作用,因为TTime comparisons give unexpected results。我无法使用 TTime 从字典中可靠地检索坐标。

  • 您将如何解决这个问题?
  • 您会完全跳过 TDictionary 并采用另一种方法吗?

【问题讨论】:

  • 我认为这是一个完全有效的问题,我希望反对者自己解释一下。
  • 不工作还不够
  • 如果您看到我的链接问题,那么您就会明白为什么它不起作用了。
  • @DavidHeffernan 我编辑了我的问题,请重新考虑你的反对意见,或者直接问我你需要什么细节。
  • 使用 TTimeStamp 作为 key 怎么样?

标签: delphi datetime dictionary delphi-2010


【解决方案1】:

TDictionary 构造函数接受 IEqualityComparer<TKey> 参数,它将用于比较键值。为TTime 实现该接口(通过从TEqualityComparer 继承)并使用SameTime 执行比较。

【讨论】:

  • 这是一个很好的答案。使用 TEqualityComparer.Construct 可能是最方便的。不过,编写散列函数可能有点棘手。为此,您需要使其与 SameTime 的实现兼容。
  • 哈希码可以是任何你想要的,只要它对被哈希的值是唯一的。由于那将是TTime,我建议将其解码为小时、分钟、秒和毫秒分量,然后将它们位移为单个整数。它们非常适合(小时需要 5 位,分钟和秒需要 6 位,毫秒需要 10 位,总共 27 位)并且不会丢失任何精度。
  • DateTimeToTimeStamp 将生成一个唯一的整数,该整数具有优于 a has 的优势,即 TTime 的准确表示。 ;-)
  • @remy 这不准确。两个不相等的值可以有相同的哈希值。
  • @DavidHeffernan:如果两个 TTime 值不代表完全相同的小时/分钟/秒/毫秒,那么它们无法使用上述任何一种技术产生相同的哈希值。
猜你喜欢
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多