我需要用我寫的密鑰類型爲Dictionary
由默認構造函數創建的`Dictionary`是否使用哈希碼?
I類閱讀documentation on MSDN about the default constructor of Dictionary
Dictionary<TKey, TValue>
需要一個平等的實現來 確定鍵是否相等。此構造函數使用默認的 通用相等比較器,EqualityComparer<T>.Default
。如果類型TKey
實現了System.IEquatable<T>
通用接口,那麼 默認的相等比較器將使用該實現。或者,您可以通過使用接受比較器參數的構造函數來指定IEqualityComparer<T>
一般 接口的實現。
這使得認爲我必須做的唯一的事情就是我的關鍵類實現System.IEquatable<T>
但是我很驚訝,System.IEquatable<T>
沒有一個HashCode()
方法。
那麼以這種方式創建的字典會使用哈希碼嗎?如果是,它從哪裏來?否則,我的字典是否有恆定的成本訪問操作(我不認爲沒有哈希碼就可以實現)
我相信c#字典實際上使用散列法 –
也讀取第二個鏈接的「備註」部分,IEquatable接口。它說:_If如果你實現'IEquatable',你還應該重載'Object.Equals(Object)'和'GetHashCode'的基類實現,以便它們的行爲與'IEquatable .Equals'方法的行爲一致。如果你重寫了'Object.Equals(Object)',那麼你的類的靜態'Equals(System.Object,System.Object)'方法的調用也會調用你重寫的實現。這確保了所有'Equals'方法的調用返回一致的結果._ –
是的,我注意到在看到Babak Naffas的回答後第二次閱讀。其實我剛接觸'.Net',看到'IEquatable'中的Equals'方法,'IEqualityComparer'中的'Equals + GetHashCode'使我認爲'Equals'和'GetHashCode'不在'Object'中在'.Net'中的類(沒有檢查,我的不好)。我沒有想到luksan的答案強調的性能問題的微妙之處,它證明了一個具有泛型參數的替代方法,因此是一個實現的通用接口。 –