2012-12-29 52 views
2

在我的課上,我實施了EqualsGetHashCode。然而,當我把它作爲我的C#代碼字典鍵,我得到的錯誤:"Key not found exception" 謝謝,GetHashCode已實現但字典無法找到密鑰?

public class Time: IEquatable<Time> 
{ 
    public String hour; 
    public String minute; 

    public Time() 
    { 
     hour = "00"; 
     minute = "00"; 
    } 

    public Time(String hour, String minute) 
     : this() 
    { 
     this.hour = hour; 
     this.minute = minute; 
    } 

    public override int GetHashCode() 
    { 
     int hash = int.Parse(hour) * 60 + int.Parse(minute); 
     return hash.GetHashCode(); 
    } 
    public override bool Equals(Time time) 
    { 

      return (this.hour == time.hour && this.minute == time.minute); 

    } 

} 

我所在的地方使用它的代碼:

Dictionary<Time, int> time2RowIndex = new Dictionary<Time, int>(); 

...

int beginRow = 0; 
if(time2RowIndex.ContainsKey(time.hour)) 
     beginRow = time2RowIndex [time.hour]; 
+0

什麼是「資源」?它是「小時」的一個實例嗎? – dtb

+0

@dtb在我的實際代碼中,Time類是Resource類的一個子類!小時應該是'時間'! –

回答

4

試試這個。訣竅是從對象(和GetHashCode)覆蓋Equals而不是僅僅實現IEquatable<>

此外,如果HourMinute上之後的Time的實例已被添加到詞典中,剷鬥的Time對象變化(由散列碼在附加的時間中選擇)將不再匹配在哈希碼目的。這意味着,即使您向字典呈現一個等價對象(例如ContainsKey),它也不會在字典中找到原始項目(因爲它將查找的哈希桶不包含原始對象)。最好的做法是在GetHashCode函數中引用的所有字段都是隻讀的,以避免這些情況。

public class Time : IEquatable<Time> 
{ 
    public String Hour; 
    public String Minute; 

    public Time() 
    { 
     Hour = "00"; 
     Minute = "00"; 
    } 

    public Time(String hour, String minute) 
     : this() 
    { 
     this.Hour = hour; 
     this.Minute = minute; 
    } 

    public override int GetHashCode() 
    { 
     return int.Parse(Hour) * 60 + int.Parse(Minute); 
    } 

    public override bool Equals(object obj) 
    { 
     var time = obj as Time; 
     return !ReferenceEquals(time, null) && Equals(time); 
    } 

    public bool Equals(Time time) 
    { 
     return string.Equals(Hour, time.Hour, StringComparison.Ordinal) && string.Equals(Minute, time.Minute, StringComparison.Ordinal); 
    } 
} 
+1

感謝@mlorbetske它的工作,但你能解釋什麼是錯誤?我猜這個錯誤是因爲我沒有實現Equals(object obj)?對? –

+1

是的,據我所知'object.Equals'用於在使用哈希代碼查找字典中的候選鍵之後完成的相等性檢查;因爲它沒有實現,所以'IEquatable.Equals'方法沒有被調用來斷言它們實際上是平等的。 – mlorbetske

相關問題