0

現在、containskey メソッドを使用して、辞書にカスタム タイプの特定のキーが含まれているかどうかを確認しようとしています。これを行うには、私が持っている gethashcode 関数をオーバーライドする必要がありますが、containskey メソッドはまだ機能していません。私が正しく行っていないことがあるに違いありませんが、過去5時間でこれを試していたことを正確に理解していません:

public class Parameter : IEquatable<Parameter>
{
    public string Field { get; set; }
    public string Content { get; set; }

    public bool Equals(Parameter other)
    {
        if (other == null)
        {
            return false;
        }

        return Field.Equals(other.Field) && Content.Equals(other.Content);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            int hash = 17;
            hash = hash * 23 + Field.GetHashCode();
            hash = hash * 23 + Content.GetHashCode();
            return hash;
        }
    }
}

public class Trigger : IEquatable<Trigger>
{
    public Dictionary<int, Parameter> Parameters { get; private set; }
    private string Event { get; set; }

    public bool Equals(Trigger item)
    {
        if (item == null)
        {
            return false;
        }

        return Event.Equals(item.Event) && Parameters.Equals(item.Parameters);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            var hash = 17;
            hash = hash * 23 + Parameters.GetHashCode();
            hash = hash * 23 + Event.GetHashCode();
            return hash;
        }
    }
}

さらに明確にするために:キーを確認したいDictionary(Trigger、State)があるので、すべてのサブクラスが同等であることを確認した場合、containskeyメソッドを使用できると想定しましたが、明らかにそうではありません。

編集:私が今行ったことは、Jon SkeetのDictionaryクラスを実装し、これを使用してチェックを行うことです:

public override bool Equals(object o)
{
    var item = o as Trigger;
    if (item == null)
    {
        return false;
    }

return Event.Equals(item.Event) && Dictionaries.Equals(Parameters, item.Parameters);
}

public override int GetHashCode()
{
    var hash = 17;
    hash = hash * 23 + Dictionaries.GetHashCode(Parameters);
    hash = hash * 23 + Event.GetHashCode();
    return hash;
}
4

2 に答える 2

4

Dictionary<,>それ自体はオーバーライドされないEqualsためGetHashCodeTrigger実装が壊れています。必要な平等を考え出し、それを自分で実装する必要があります。

protobuf-csharp-port にサンプル実装があります。これを確認してください。

編集:あなたの変更はまだ正しくありません。次のように等式を実装する必要があります。

return Event.Equals(item.Event) && 
       Dictionaries.Equals(Parameters, item.Parameters);

次のように実装GetHashCodeします。

var hash = 17;
hash = hash * 23 + Dictionaries.GetHashCode(Parameters);
hash = hash * 23 + Event.GetHashCode();
return hash;
于 2013-04-15T14:49:32.680 に答える
0

オーバーロードされたコンストラクターを使用する必要があります。

Dictionary<TKey, TValue>(IDictionary<TKey, TValue>, IEqualityComparer<TKey>)

自動プロパティを使用する代わりに、バックアップ フィールドを使用します。

于 2013-04-15T14:53:41.527 に答える