C# containskey和gethashcode的问题
我目前正在尝试使用containskey方法来检查我拥有的字典是否包含自定义类型的某个键。要做到这一点,我应该重写gethashcode函数,我有这个函数,但是containskey方法仍然不起作用。一定有什么事情我做得不对,但我还没有弄清楚在过去的5个小时里我到底在做什么:C# containskey和gethashcode的问题,c#,dictionary,gethashcode,C#,Dictionary,Gethashcode,我目前正在尝试使用containskey方法来检查我拥有的字典是否包含自定义类型的某个键。要做到这一点,我应该重写gethashcode函数,我有这个函数,但是containskey方法仍然不起作用。一定有什么事情我做得不对,但我还没有弄清楚在过去的5个小时里我到底在做什么: public class Parameter : IEquatable<Parameter> { public string Field { get; set; } public string
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
本身不会覆盖Equals
和GetHashCode
——因此您的触发器
实现被破坏。你需要弄清楚你想要什么样的平等,然后自己去实现
我有一本你可能想看的书
编辑:您的更改仍然不太正确。您应该像这样实现平等:
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;
Dictionary
本身不会覆盖Equals
和GetHashCode
——因此您的触发器
实现被破坏。你需要弄清楚你想要什么样的平等,然后自己去实现
我有一本你可能想看的书
编辑:您的更改仍然不太正确。您应该像这样实现平等:
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;
您应该使用重载构造函数:
Dictionary<TKey, TValue>(IDictionary<TKey, TValue>, IEqualityComparer<TKey>)
字典(IDictionary,IEqualityComparer)
不要使用自动属性,而是使用备份字段。您应该使用重载构造函数:
Dictionary<TKey, TValue>(IDictionary<TKey, TValue>, IEqualityComparer<TKey>)
字典(IDictionary,IEqualityComparer)
不要使用autoproperty,而是使用备份字段。我在代码中没有看到自定义类型用作键。您只使用int作为键。您需要显示问题的代码。我有一本字典正在检查这个问题。state是我拥有的另一个自定义类,但这对于这个问题并不重要。我在代码中没有看到自定义类型用作键。您只使用int作为键。您需要显示问题的代码。我有一本字典正在检查这个问题。state是我拥有的另一个自定义类,但这对这个问题并不重要我不明白你的意思真的,我已经为gethashcode实现了我自己的覆盖,并为我的基本对象实现了equals,那么我做错了什么呢?@KendeJong:看看你的实现——你调用的是
参数。Equals
和参数。GetHashCode
,而这些在字典中没有被覆盖。所以如果我理解正确,我应该实现对“标准”字典的Equals和gethashcodes的覆盖?@KendeJong:不,你不应该在字典上调用Equals
和GetHashCode
,而是调用code检查相等性,或者按照我在链接示例中显示的方式计算哈希代码。使用当前解决方案编辑的问题我真的不明白你的意思,我已经为我的基本对象实现了我自己的gethashcode覆盖和equals覆盖,那么我做错了什么呢?@KendeJong:看看你的实现-你在调用参数。equals
和参数。gethashcode
,而这些都没有在字典中覆盖。所以如果我理解正确,我应该实现对“标准”字典的equals和gethashcodes的覆盖?@KendeJong:不,你不应该在字典上调用equals
和GetHashCode
,而是调用代码检查是否相等,或者按照我在链接示例中显示的方式计算哈希代码。使用当前解决方案编辑问题