为了解释我的问题,我将使用与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,这样我在创建字典时就不需要了?
你在这里混合两件事.IComparable用于分类.
IEqualityComparer<T>是检查两个项是否相等,但它也有GetHashCode字典在内部使用的方法.
对于对象,默认实现IEqualityComparer<T>使用来自TObject 的虚拟GetHashCode和Equals方法.因此,如果您想将两个不同的实例视为相等,则有两个选项:
在您的类中重写这两个方法
提供自定义实现 IEqualityComparer<T>
| 归档时间: |
|
| 查看次数: |
727 次 |
| 最近记录: |