[英]My IEquatable is still using Object.GetHashcode for Dictionary<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>
需要一個相等的實現來確定鍵是否相等。 如果comparer為null,則此構造函數使用默認的通用相等比較器EqualityComparer<T>.Default
。 如果類型TKey
實現System.IEquatable<T>
泛型接口,則默認的相等比較器使用該實現。
然而,從我所看到的使用字典索引器Dictionary<T>[]
,它仍然依賴於重寫GetHashcode,例如public override int GetHashCode()
我可以看到有建議覆蓋該批次的一致性,但我試圖更多地理解它。 是因為IEquatable應該直接在MyClass上而不是在IMyClass中嗎? 但我更喜歡它在IMyClass上,所以實現者需要成為字典鍵。
我正在嘗試IEqualityComparer,但據我所知,我不需要它。
Dictionary
總是首先檢查GetHashCode
,然后繼續查看存儲桶的元素
假設Dictionary
為長度為L的Array
,在新元素添加時,它會計算出適當的索引
index = item.GetHashCode() % L
並將該元素放在適當的桶的末尾(只是一個模型,實際上它也需要Abs,並在必要時重新構建一個數組)
所以在任何一點上它都有以下結構
---
0 -> Item1, Item2
---
1 -> Item3
---
2
---
...
---
L-1-> Item7
在查找時,字典再次計算索引,並使用Equality僅檢查計算索引的存儲區元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.