实现了GetHashCode但是Dictionary无法找到密钥?

Sae*_*var 3 c# dictionary iequatable gethashcode

在我的班上,我实施了EqualsGetHashCode.但当我在C#代码中使用它作为字典的键时,我收到错误:"Key not found exception" 谢谢,

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);

    }

}
Run Code Online (Sandbox Code Playgroud)

以及我使用它的代码:

Dictionary<Time, int> time2RowIndex = new Dictionary<Time, int>();
Run Code Online (Sandbox Code Playgroud)

...

int beginRow = 0;
if(time2RowIndex.ContainsKey(time.hour))
      beginRow = time2RowIndex [time.hour];
Run Code Online (Sandbox Code Playgroud)

mlo*_*ske 5

试试这个.诀窍是Equals从对象(和GetHashCode)覆盖而不是仅仅实现IEquatable<>.

另外,如果HourMinuteTime实例后对象变化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);
    }
}
Run Code Online (Sandbox Code Playgroud)