C# containskey和gethashcode的问题

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

我目前正在尝试使用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
本身不会覆盖
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
,而是调用代码检查是否相等,或者按照我在链接示例中显示的方式计算哈希代码。使用当前解决方案编辑问题