如果我使用 TDictionary 在 Delphi 中实现关系 Car <-> Owner,我应该如何实现 IEqualityComparer 的 Equals 和 GetHashCode 函数?(GetHashCode 返回一个 Integer,用于 TDictionary 中的散列。)
对于 TVehicle 类,假设它有一个 VIN(车辆识别号)。
我应该如何实现 VIN 的哈希码?
更新:在这个例子中,对象身份并不意味着“两个对象指针的内存位置的身份”,而是“同一对象的两个实例的身份,基于其属性的唯一和不变(“不可变”)组合” .
因此,我不需要通过地图中的内存地址搜索车辆,而是需要具有我正在寻找的 id 的车辆。
考虑一个包含车主数据的数据库,在应用程序启动时加载到字典中。现在,如果用户在申请表中输入 VIN,应用程序如何在字典中找到车辆?VehicleFactory.CreateVehicleFromDatabase(Edit1.Text);
如果代码使用并在字典中搜索此对象创建一个新实例,则 Equals 的默认实现将不会在映射中找到任何条目,因为它会查找内存地址。为了找到车辆,Equals 需要比较 VIN。
所以我必须创建一个自定义的 IEqualityComparer。实现 Equals 是微不足道的。但是 GetHashCode 呢?对于字符串属性,我不能简单地使用字符串的地址(请参阅Are Delphi strings immutable中的 Berry Kelly :“如果您从两个单独的代码部分创建相同的字符串,它们将不会共享相同的后备存储”) ,因此字符串属性的 GetHashCode 函数需要自定义实现。
我还发现我发现了如何使用 Delphi 散列字符串?- 有一个例子,其中包含HashValue('Hello World')