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

alo*_*ono 2 delphi dictionary

为了解释我的问题,我将使用与Embarcadero网站上的TDictionary 示例非常相似的内容,但我的课程实现了IComparable.

在Delphi(XE7)中:

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

  function CompareTo(Obj: TObject): Integer;
end;
Run Code Online (Sandbox Code Playgroud)

我希望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');
Run Code Online (Sandbox Code Playgroud)

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

CityB := TCity.Create;
CityB.Country := 'United Kingdom';
CityB.Latitude := 51.5;
CityB.Longitude := -0.17;
Run Code Online (Sandbox Code Playgroud)

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

Dictionary.ContainsKey(CityB)
Run Code Online (Sandbox Code Playgroud)

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

那么如何在ContainsKey我的课程中添加一个等级比较器,除了CompareTo已经存在的等级比较器?

我知道我可以使用TDelegatedEqualityComparer匿名方法来创建在创建字典时使用的自定义比较器.就像是:

Dictionary := TDictionary<TCity, string>.Create(CityComparer)
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*nke 7

你在这里混合两件事.IComparable用于分类.

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

对于对象,默认实现IEqualityComparer<T>使用来自TObject 的虚拟GetHashCodeEquals方法.因此,如果您想将两个不同的实例视为相等,则有两个选项:

  1. 在您的类中重写这两个方法

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