【问题标题】:TDictionary.ContainsKey returning false, even though the key existsTDictionary.ContainsKey 返回 false,即使密钥存在
【发布时间】:2012-02-26 16:02:53
【问题描述】:

我现在面临的问题完全让我觉得我根本不懂编程。我有一个TDictionary 对象,它由成对的TDate => TEvent (custom class) 组成。该对象用于由两个单独的应用程序共享的类(它们不通信)。在一个应用程序中,以下工作正常:

  //  Get recipes from the very event.
  Tmp := FCalendar.ContainsKey(D);
  if (Tmp) then
  begin
    E := FCalendar[D];
    CopyRecipes(E);
  end;

另一方面,同一段代码在其他应用程序中不起作用!这怎么可能?我附上了调试器中发生的情况的屏幕截图:

如您所见,键存在于字典中,但 ContainsKey() 返回 FALSE

这是什么原因造成的?

问候, 帕特里克。

【问题讨论】:

    标签: delphi generics dictionary delphi-xe2


    【解决方案1】:

    原因是TDate 实际上只是一个TDateTime。这意味着它是一个双精度值,包含自 Delphi 时代以来的天数。 TDate 的 IDE 调试提示仅显示日期部分并省略时间部分。您正在比较相等性,因此同一天但具有不同时间分量的两个值将不相等。这是一个截图来说明:

    通过使用DateOf 删除日期时间的时间部分来解决问题。每当您收到日期值时,都必须使用DateOf,并且在添加到字典之前很明显。

    【讨论】:

    • 您如何解释它在一个应用程序中有效,而在另一个应用程序中无效?
    • 看看DKey 转换为TDateTime,你会看到区别。至于那条评论中的问题,你问的有点多,不是吗?
    • 确实,我没有冒犯的意思。你是对的,情况就是这样。使用DateOf() 解决了这个问题。谢谢,大卫!
    • 没有冒犯。我只是无法回答有关您的应用的问题。无论如何,很好,你被排序了。
    【解决方案2】:

    可能在 D 不是 2011-11-11 可能 D:=2011-11-11 00-00-00

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 2021-11-30
      • 2011-11-29
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多