我想创建一个概念上为 Dictionary<HashSet<int>, FooBar>
的字典HashSet<int>
在哪里在 key 中有以下限制:
- 成员只能从0到N中选出
我认为有了限制,应该有比编写自定义 IEqualityComparer
更高效的方法来做到这一点(如这篇文章中所述 C# List as Dictionary key )。例如,当 N<64 时,每个这样的哈希集都可以映射到唯一的 Int64。假设列表包含 1,3,18,29,那么 (1 << 1) + (1 << 3) + (1 << 18) + (1 << 29)
537133066 可以代表这个组合,所以我可以实现 Dictionary<Int64, FooBar>
实现我的目标。然而,显然这种方法不会超过 64。
------11/11/2016 更新------
感谢那些在下面发表评论的人。现在我对散列的工作原理有了更好的理解,我想尝试为 HashSet<int>
创建一个无冲突的散列。正如我用无界 N 描述的那样,要么不可能,要么太难,因此不值得。
我在这个问题下也找到了一个很好的解决方案:How do I use HashSet<T> as a dictionary key? .我不确定它的性能如何,但至少它很容易实现。
最佳答案
更好的方法是在列表中生成您的值的哈希值,并使用带有 int 或 long 作为键的字典。
关于C# 一组已知整数作为字典自定义键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40535408/