AHashSet<T>
は、特定のアイテムが含まれているかどうかを O(1) で判断できます。カスタム クラスでをオーバーライドするEquals()
とGetHashCode()
、オブジェクト A と別のオブジェクト A' を持つことができます。これらはID では等しくないが、同じハッシュ コードをEquals()
返しtrue
たり返したりします。GetHashCode()
ここで、A がハッシュ セットに含まれていることを考えると、A' (ハッシュ セットの観点からは A に等しい) を指定して、O(1) で A を取得したいと考えています。
var a = new MyClass("A");
var a_prime = new MyClass("A");
Debug.Assert(a.Equals(a_prime));
Debug.Assert(a.GetHashCode() == a_prime.GetHashCode());
var set = new HashSet<MyClass>();
set.Add(a);
Debug.Assert(set.Contains(a_prime));
// This:
var retrieved_a = set.Get(a_prime);
これを行う方法?
(これには私が探している答えがなく、これにはまったく答えがないことに注意してください。)
背景情報: セットを使用して、C# が文字列をインターンするのと同じ方法で自分のオブジェクトをインターンしたい: 等しいオブジェクトにはインスタンスが 1 つだけ必要です。このようにして、そのようなオブジェクトにメタデータを追加し、そのメタデータを持たない同等のインスタンスが他に存在しないことを確認できます。