現在、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;
}