我目前正在尝试使用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;
}
}
}
为了更加清晰:我有一个字典(触发器,状态),我想检查键,所以我假设如果我确保我的所有子类是等同的我可以只使用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;
}
答案 0 :(得分:4)
Dictionary<,>
本身不会覆盖Equals
和GetHashCode
- 因此您的Trigger
实施已被破坏。你需要找出你想要的平等并自己实现它。
我有一个你可能想看的sample implementation in 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;
答案 1 :(得分:0)
您应该使用重载的构造函数:
Dictionary<TKey, TValue>(IDictionary<TKey, TValue>, IEqualityComparer<TKey>)
而不是使用autoproperty,请使用备用字段。