delphi - 在 Delphi 中如何拥有一个实现 IComparable 并继承自 TEqualityComparer 的类?

标签 delphi dictionary

为了解释我的问题,我将使用与TDictionary example 非常相似的内容。在 Embarcadero 的网站上,但我的类实现了 IComparable

在德尔福 (XE7) 中:

TCity = class(TInterfacedObject, IComparable)
  Country: String;
  Latitude: Double;
  Longitude: Double;

  function CompareTo(Obj: TObject): Integer;
end;

我想要一个以城市为键的TDictionary:

Dictionary := TDictionary<TCity, string>.Create;

CityA := TCity.Create;
CityA.Country := 'United Kingdom';
CityA.Latitude := 51.5;
CityA.Longitude := -0.17;
Dictionary.Add(CityA, 'London');

现在,如果我创建一个具有与之前相同值的新城市,其中 CityA.CompareTo(CityB) 返回 0,例如:

CityB := TCity.Create;
CityB.Country := 'United Kingdom';
CityB.Latitude := 51.5;
CityB.Longitude := -0.17;

在将 CityB 添加到字典之前,我期望:

Dictionary.ContainsKey(CityB)

会使用我的 CompareTo 实现,而 ContainsKey 会返回 True,但事实并非如此。看来我的类也需要继承TEqualityComparer

那么,除了已经存在的 CompareTo 之外,我该如何添加一个由 ContainsKey 使用的相等比较器到我的类中呢?

我知道我可以使用 TDelegatedEqualityComparer 和匿名方法来创建自定义比较器,以便在创建字典时使用。像这样的东西:

Dictionary := TDictionary<TCity, string>.Create(CityComparer)

但是有没有办法在 TCity 中包含相等比较器,这样我在创建字典时就不需要了?

最佳答案

你在这里混合了两种东西。 IComparable用于排序。

IEqualityComparer<T>是检查两个项目是否相等但它也有 GetHashCode字典内部使用的方法。

对于对象,IEqualityComparer<T> 的默认实现使用虚拟 GetHashCodeEquals来自 TObject 的方法。所以如果你想平等对待两个不同的实例,你有两个选择:

  1. 在你的类中覆盖这两个方法

  2. 提供 IEqualityComparer<T> 的自定义实现

关于delphi - 在 Delphi 中如何拥有一个实现 IComparable 并继承自 TEqualityComparer 的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32086743/

相关文章:

python - 从文本文件创建字典 Python Numpy

delphi - 为什么访问动态数组的越界索引不会引发 AV?

delphi - 分配时出现 JPEG 错误 #42

swift - 字典的扩展 where <String, AnyObject>

ios - SwiftyJSON 并添加到现有 [String : AnyObject] dictionary

arrays - 以键为数组类型的散列

c# - 什么是 C# 中的 Delphi "shl"?

delphi - 大型动态数组 - 写入速度慢

delphi - TWebBrowser-试图修复“无效的浮点运算”错误

c# - 缓存 - IDictionary 与顶级键前缀