【问题标题】:Default IEqualityComparer for TDictionary<TObject, TObject>?TDictionary<TObject, TObject> 的默认 IEqualityComparer?
【发布时间】:2011-07-15 23:23:44
【问题描述】:

我刚看完

"任何实现 IEqualityComparer 接口是 预计提供实施 Equals 方法。” - (Delphi DocWiki)

"任何实现 IEqualityComparer 接口是 预计提供实施 GetHashCode 方法。" - (Delphi DocWiki)

如果我创建 TDictionary&lt;TObject, TObject&gt; 并且不实现 IEqualityComparer,TDictionary 的性能会如何?

我还没有找到默认实现(在 Delphi 2009 中)。那么如何计算它们的键的哈希码呢?

如果它只是字典条目键中对象的内存地址,是否会按顺序执行对给定条目的搜索?

【问题讨论】:

    标签: performance delphi generics tdictionary


    【解决方案1】:

    使用 TObject 键的默认实现将执行得非常好。平等被定义为对象身份,与测试if A=B 相同。哈希只是引用的地址——效率再高不过了。

    代码如下所示:

    function TObject.Equals(Obj: TObject): Boolean;
    begin
      Result := Obj = Self;
    end;
    
    function TObject.GetHashCode: Integer;
    begin
      Result := Integer(Self);
    end;
    

    在散列字典中查找不涉及搜索。这是一个高效的 O(1) 操作。我认为您应该阅读Wikipedia 文章。

    【讨论】:

    • Delphi 可以在 TObject 类中添加 Equals 和 GetHashCode 作为新方法,而不是引入 IEqualityComparer 接口,也许
    • @mjn 并非所有可以放入 TDictionary 的内容都源自 TObject,因此在我看来,强迫您使用 TObject 会削弱它。无法使用字符串、GUID 等。
    • 哦,我忘了——对了,Delphi 中没有 String 或 GUID 类。
    • 什么是“在散列字典中查找不涉及搜索”。意思是?维基百科中的文章提到了内容可寻址内存...
    • @mjn 在那篇文章中都有。您询问查找是否涉及顺序搜索。它没有。这是一个 O(1) 操作。对于线性搜索,检索值的预期时间会随着容器大小的增加而增加。哈希不是这种情况。
    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2014-07-31
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多