从O(1)中的HashSet <T>获取一个相等的对象

Dan*_*ker 8 c# set

A HashSet<T>可以在O(1)中确定它是否包含某个项目.如果我覆盖Equals()GetHashCode()在我的自定义类上,我可以有一个对象A和另一个对象A',它们相同,但是Equals()返回trueGetHashCode()返回相同的哈希码.

现在,假设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);
Run Code Online (Sandbox Code Playgroud)

这该怎么做?

(请注意,已经不是我要找的答案,这个没有答案的.)


一些背景信息:我想使用set来实习我自己的对象,就像C#interns strings一样:等于对象只需要一个实例.通过这种方式,我可以将元数据附加到这样的对象,并确保没有该元数据,在任何地方都没有其他相同的实例.

Mar*_*ers 7

没有方法HashSet可以做你想要的.

你可以用一个Dictionary代替:

var dict = new Dictionary<MyClass, MyClass>();
dict[a] = a;
Debug.Assert(dict.ContainsKey(a_prime));
var retrieved_a = dict[a_prime];
Run Code Online (Sandbox Code Playgroud)

  • @svick我不知道,这对我来说似乎很奇怪.我想我没有任何具体的理由可以避免它,但我从来没有使用过这样的结构,但出于某种原因看着`dict [a] = a;`让我感到畏缩. (3认同)