2014-02-14 34 views
4

我有類似以下的內容是通用字典的關鍵。我的IEquatable仍在使用Object.GetHashcode用於字典<T> []

class IMyClass<T> : IEquatable<IMyClass> where T : struct 
{ 
    //etc 
} 


class MyClass<T> : IMyClass<T> where T : struct 
{ 
    public bool Equals(IRatingKey<T> other) 
    { 
     //etc 
    } 
} 

據我瞭解的EqualityComparer<T>.Default,但應該看到,我已經實現IEquatable<T>,因此動態創建的EqualityComparer。

Dictionary<TKey, TValue>要求等式實現爲 確定密鑰是否相等。如果比較器爲空,則此構造函數使用默認的通用相等比較器 EqualityComparer<T>.Default。如果類型TKey實現通用接口 System.IEquatable<T>,則默認的相等比較器 將使用該實現。

但是從我所看到的使用字典索引Dictionary<T>[]的,它仍然依賴於壓倒一切的GetHashCode如public override int GetHashCode()

我可以看到,有建議重寫了很多的一致性,但我試圖更多地理解它。是因爲IEquatable應該直接在MyClass上而不是在IMyClass中?但我更喜歡IMyClass,所以實現者需要成爲一個字典密鑰。

我正在試驗IEqualityComparer,但從我的理解我不需要它。

+0

因此使用索引器肯定會使用'GetHashCode()',這就是它生成原始哈希碼的方式。**用於確定在添加時將其放置在哪個存儲桶中的一個。 –

+2

嘿,任何理由投票關閉或downvote?我想如果有人不確定字典是如何工作的,那麼SO是個好地方... –

+0

真@MichaelPerrenoud,感謝您的反饋。我發現它需要GetHashCode(),它需要它是有意義的。但在文檔中尚不清楚,所以我想確保。 –

回答

2

Dictionary總是檢查GetHashCode第一,比前進尋找到剷鬥的元件

假設Dictionary作爲Array長度爲L,對新元素添加它計算像

index = item.GetHashCode() % L

適當的索引

並將該元素放到適當的桶的末尾(只是一個模型,實際上它也需要Abs,並在必要時重新構建數組)

因此,在任何一點上具有以下結構

--- 
0 -> Item1, Item2 
--- 
1 -> Item3 
--- 
2 
--- 
... 
--- 
L-1-> Item7 

在查找,詞典再次計算指數,並使用平等檢查計算指數的唯一區塊的元素。

+0

感謝Arsen,所以在文檔中明確說明了Dictionary的其他部分如何在'外部'上工作。但在內部存儲它仍然需要GetHashCode()? –

+0

我說我不需要IEqualityComparer嗎?作爲EqualityComparer 。默認爲我排序? –

+0

是的,IEquatable是關鍵,我相信它是Dictionary 。默認將用於創建一個IEqualityComparer在飛行(有點?) –