C#集预知整数作为字典的自定义键的

问题描述:

我想创建的字典,是概念性Dictionary<HashSet<int>, FooBar>其中在该键的HashSet<int>具有以下限制:C#集预知整数作为字典的自定义键的

  1. 成员只能从0被选择为N

我认为在限制的情况下,应该有比编写自定义IEqualityComparer(如本文后C# List as Dictionary key中所述)更有效的方法来做到这一点。例如,当每个这样的散列集可以被映射到唯一的Int64时。假设列表包含1,3,18,29,然后(1 << 1) + (1 << 3) + (1 << 18) + (1 << 29)这就是537133066可以代表这个组合,所以我可以实现Dictionary<Int64, FooBar>来实现我的目标。但是显然这种方法没有扩展到超过64

------ 2016年11月11日更新------

感谢那些谁以下评论。现在我更好地理解哈希如何工作,并且我认为试图为HashSet<int>创建一个无碰撞哈希,正如我所描述的那样,无限N不是不可能就是太难,因此不值得。

另外我在这个问题下找到了一个很好的解决方案:How do I use HashSet<T> as a dictionary key?。我不确定它的表现如何,但至少它很容易实现。

+1

难道你不能改变这个dicitonary关键字为一个字符串和concat用逗号分隔的关键成员? –

+0

这是什么问题? –

+1

请记住,散列码不必是_unique_ - 它们只需要对于两个相等的对象是相同的。尽管你希望尽可能地分配一个分布,但是有散列冲突是没有问题的,因为“Equals”将会被调用。所有说'Dictionary '将限制可能键的数量,而'Dictionary ,FooBar>'不会。 –

更好的办法是在列表中生成你的值的散列,并使用int或long作为键的字典。