3

私のクラスでは、とを実装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];
4

1 に答える 1

5

これを試して。トリックは、単に実装するのではなく、Equalsオブジェクト (および) からオーバーライドすることです。GetHashCodeIEquatable<>

また、のインスタンスがディクショナリに追加された後にオブジェクトが変更されたHour場合、バケット (追加時にハッシュ コードによって選択された) はオブジェクトのハッシュ コードと一致しなくなります。これは、同じ値のオブジェクトをディクショナリに提示しても (たとえば で)、ディクショナリで元の項目が見つからないことを意味します (それが検索するハッシュ バケットに元のオブジェクトが含まれていないため)。このような状況を回避するために、関数で参照されるすべてのフィールドを読み取り専用にすることをお勧めします。MinuteTimeTimeContainsKeyGetHashCode

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);
    }
}
于 2012-12-29T07:17:51.153 に答える