簡體   English   中英

我的IEquatable仍在使用Object.GetHashcode for Dictionary <T> []

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM