如何使用 HashSet作为字典键?
我希望使用 HashSet
作为字典的键:
Dictionary<HashSet<T>, TValue> myDictionary = new Dictionary<HashSet<T>, TValue>();
我想从字典中查找值,这样 HashSet
的两个不同实例 < em>包含相同的项目将返回相同的值。
HashSet
的 Equals()
和 GetHashCode()
实现似乎没有这样做(我认为它们只是默认值)。我可以重写 Equals()
以使用 SetEquals()
,但是 GetHashCode()
又如何呢?我感觉我在这里失去了一些东西......
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以使用
HashSet
提供的集合比较器:You could use the set comparer provided by
HashSet<T>
:digEmAll 的答案显然是实践中更好的选择,因为它使用内置代码而不是重新发明轮子。但我将把它作为示例实现。
您可以使用
SetEquals
实现一个IEqualityComparer>
。然后将其传递给字典的构造函数。类似以下内容(未测试):请注意,这里的哈希函数是可交换的,这很重要,因为集合中元素的枚举顺序是未定义的。
另一个有趣的点是,您不能只使用 elem.GetHashCode ,因为当向集合提供自定义相等比较器时,这会给出错误的结果。
digEmAll's answer is clearly the better choice in practice, since it uses built in code instead of reinventing the wheel. But I'll leave this as a sample implementation.
You can use implement an
IEqualityComparer<HashSet<T>>
that usesSetEquals
. Then pass it to the constructor of the Dictionary. Something like the following(Didn't test it):Note that the hash function here is commutative, that's important because the enumeration order of the elements in the set is undefined.
One other interesting point is that you can't just use
elem.GetHashCode
since that will give wrong results when a custom equality comparer was supplied to the set.您可以向 Dictionary 构造函数提供
IEqualityComparer>
并在该比较器中进行所需的实现。You can provide a
IEqualityComparer<HashSet<T>>
to the Dictionary constructor and make the desired implementation in that comparer.