2016-11-10 66 views
0

我想創建的字典,是概念性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>'不會。 –

回答

1

更好的辦法是在列表中生成你的值的散列,並使用int或long作爲鍵的字典。