TDictionary を使用して Delphi で関係 Car <-> Owner を実装する場合、IEqualityComparer の Equals および GetHashCode 関数をどのように実装すればよいですか? (GetHashCode は、TDictionary でのハッシュに使用される整数を返します。)
TVehicle クラスの場合、VIN (車両識別番号) があると仮定します。
VIN のハッシュコードはどのように実装すればよいですか?
更新: この例では、オブジェクト ID は「2 つのオブジェクト ポインターのメモリ位置の ID」を意味するのではなく、「プロパティの一意で不変 ("不変") な組み合わせに基づく、同じオブジェクトの 2 つのインスタンスの ID」を意味します。 .
したがって、マップ内のメモリ アドレスで車両を検索する代わりに、探している ID を持つ車両が必要です。
アプリケーションの起動時にディクショナリにロードされる車両所有者データを含むデータベースを考えてみてください。ユーザーがアプリケーション フォームに VIN を入力した場合、アプリケーションはどのようにして辞書で車両を見つけることができるのでしょうか? コードがVehicleFactory.CreateVehicleFromDatabase(Edit1.Text);
このオブジェクトを使用して新しいインスタンスを作成し、辞書で検索する場合、Equals の既定の実装では、メモリ アドレスを検索するため、マップ内のエントリが見つかりません。車両を見つけるために、Equals は VIN を比較する必要があります。
したがって、カスタム IEqualityComparer を作成する必要があります。Equals の実装は簡単です。しかし、GetHashCode はどうでしょうか。文字列プロパティの場合、文字列のアドレスを単純に使用することはできません ( Delphi 文字列は不変ですか?の Berry Kelly を参照してください:「コードの 2 つの別々のセクションから同じ文字列を作成すると、同じバッキング ストアを共有しません」)。であるため、文字列プロパティの GetHashCode 関数にはカスタマイズされた実装が必要です。
Delphi で文字列をハッシュするにはどうすればよいですか? という質問も見つけました。- を含む例がありますHashValue('Hello World')