c# - GetHashCode 已实现,但 Dictionary 无法找到 key ?

标签 c# dictionary gethashcode iequatable

在我的类(class)中,我实现了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);

    }

}

以及我使用它的代码:

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

...

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

最佳答案

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

此外,如果 HourMinuteTimeTime 实例后的对象更改已添加到字典中,桶(在添加时通过哈希码选择)将不再匹配对象上的哈希码。这意味着即使你向字典提供一个等值的对象(比如 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);
    }
}

关于c# - GetHashCode 已实现,但 Dictionary 无法找到 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14079500/

相关文章:

c# - 禁用和启用后 WPF 文本框焦点 "sticking"

c# - SSMS 加载项警告

c# - 是否有 IDictionary 实现在缺少键时返回默认值而不是抛出?

c# - Entity Framework 4 覆盖自己的类属性的 Equals 和 GetHashCode

c# - GetHashCode 获取相似值

尽管文件存在并设置工作目录,C# Process.Start() 仍未启动

c# - 将 Xamarin 连接到 Python MySQL 连接器

C# 反序列化字典<Int,Object> 使用 Json.NET 失败

c++ - 为什么 map::clear 不调用析构函数?

c# - 如何在覆盖 GetHashCode() 的类型上使用 Object.GetHashCode()