A HashSet<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);
Run Code Online (Sandbox Code Playgroud)
这该怎么做?
一些背景信息:我想使用set来实习我自己的对象,就像C#interns strings一样:等于对象只需要一个实例.通过这种方式,我可以将元数据附加到这样的对象,并确保没有该元数据,在任何地方都没有其他相同的实例.
没有方法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)
| 归档时间: |
|
| 查看次数: |
1576 次 |
| 最近记录: |