在我的类(class)中,我实现了Equals
和GetHashCode
。然而,当我在 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<>
.
此外,如果 Hour
或 Minute
在 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);
}
}
关于c# - GetHashCode 已实现,但 Dictionary 无法找到 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14079500/