为了解释我的问题,我将使用与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>
的默认实现使用虚拟 GetHashCode
和 Equals
来自 TObject 的方法。所以如果你想平等对待两个不同的实例,你有两个选择:
在你的类中覆盖这两个方法
提供
IEqualityComparer<T>
的自定义实现
关于delphi - 在 Delphi 中如何拥有一个实现 IComparable 并继承自 TEqualityComparer 的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32086743/