对于具有字典<t,k>作为属性</t,k>的类的Equals和HashCode

时间:2014-01-20 11:58:29

标签: c# dictionary

如您所知,C#中的Dictionary类不会覆盖EqualshashCode。我面临的情况是我有一个具有属性Dictionary<T,K>的类。我使用标准的VS片段为这个类生成了哈希码和等号。因此,当在此类的实例上调用.Equals()时,对于字典属性,将调用对象的.Equals(),并且我总是得到错误的结果。

附件是一个示例虚拟类,用于澄清。

public class TestClass : IEquatable<TestClass>
{
    private string _dummyName;
    private Dictionary<string, string> _dummyDict;

    public bool Equals(TestClass other)
    {
        if (ReferenceEquals(null, other)) return false;
        if (ReferenceEquals(this, other)) return true;
        return Equals(other._dummyName, _dummyName) && Equals(other._dummyDict, _dummyDict);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != typeof (TestClass)) return false;
        return Equals((TestClass) obj);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            return ((_dummyName != null ? _dummyName.GetHashCode() : 0)*397) ^ (_dummyDict != null ? _dummyDict.GetHashCode() : 0);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

你正在打电话

return Equals(other._dummyName, _dummyName) && Equals(other._dummyDict, _dummyDict);

将调用您的Equals实施。对于非{1}}类型的所有对象,此实现返回false,只要它们不是引用相等。

你的第一个调用hasr字符串作为参数,你的第二个调用字典。两者都要归零。