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;
        }
    }
}

为了更加清楚:我有一个字典(触发器,状态),我想检查它的键,所以我假设如果我确保我的所有子类都是平等的,我可以只使用 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-GetHashCode所以你的Trigger实现被破坏了。您需要弄清楚您想要什么平等并自己实施。

在 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 回答