AHashSet<T>
可以在 O(1) 中确定它是否包含某个项目。如果我在我的自定义类上覆盖Equals()
和GetHashCode()
,我可以拥有一个对象 A 和另一个对象 A',它们的身份不Equals()
相等,但返回true
并GetHashCode()
返回相同的哈希码。
现在,假设 A 在散列集中,我想在给定 A' 的 O(1) 中检索 A(从散列集的角度来看,它等于 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# 实习生字符串一样:相等的对象只需要一个实例。这样,我可以将元数据附加到这样的对象,并确保在没有该元数据的任何地方都没有其他相同的实例。