2016-11-21 55 views
1

我有一個自定義比較器的類型(字典)的詞典,因爲我們想要存儲2個給定類型之間的關係(對於MVVM模式),我需要幫助以一種方式獲得自定義EqualityComparer工作。EqualityComparer <Type> GetHashCode和等於

做了一些研究,我發現GetHashCode方法在Equals方法之前被調用,我怎麼才能得到哈希碼?,預期的行爲,如果我試圖從我的字典中得到一個「Square」一個「GeometricShape」已經在這,它返回「GeometricShape」的價值,我不能找到一種方法來散列它,我給出了預期的結果

public class DictionaryComparer : EqualityComparer<Type> 
{ 
    public override bool Equals(Type x, Type y) 
    {    
     return x.IsAssignableFromType(y); 
    } 

    public override int GetHashCode(Type obj) 
    { 
     return obj.GetHashCode(); 
    } 
} 
+0

這個問題需要一些澄清。你是否試圖告訴Dictionary,如果你訪問關鍵字X(不在Dictionary上)並且它有關鍵字X',它應該返回以後的值?如果是這樣,您是否意識到您將無法添加可分配給字典中已有的其他密鑰的密鑰? –

+0

我有一種感覺(儘管我可能是錯的),您正嘗試使用錯誤的工具來完成這項工作。你能解釋一下你試圖用這個做什麼嗎? –

+0

MVVM和字典。這是一種代碼味道。我首先建議你切換到KeyedCollections,或者完全不需要鍵控集合。至於你想要什麼......不確定。 – Will

回答

2

你不能有比較器的方式使用「可從...分配」作爲等效操作。

Equals具有依賴於它的類所承擔的特定規則。如果你違反規則,使用這種比較器的結果本質上是隨機洗牌。

Guidelines for Overloading Equals()

x.Equals(x)返回true。
x.Equals(y)返回與y.Equals(x)相同的值
如果(x.Equals(y) && y.Equals(z))返回true,則x.Equals(z)返回true。

我真的不知道如何解決您的特定情況下,可能如果你只需要一個類型映射到另一個你不得不Dictionary<Type,Type>並直接把類型吧。

相關問題