EqualityComparer <type> GetHashCode和Equals

时间:2016-11-21 23:03:04

标签: c# dictionary mvvm hashcode iequalitycomparer

我有一个带有自定义比较器的类型字典(Dictionary),因为我们想要存储两种给定类型之间的关系(对于MVVM模式),我需要帮助提出一种方法来使自定义EqualityComparer工作。

进行一些研究我发现GetHashCode方法在Equals方法之前被调用,我怎样才能使哈希码正确?如果我试图得到一个&#34; Square&#34,它的预期行为是什么? ;从我的字典中,它有一个&#34; GeometricShape&#34;已经在其中,它返回&#34; GeometricShape&#34;的值,我找不到以我给出预期结果的方式散列它的方法

public class DictionaryComparer : EqualityComparer<Type>
{
    public override bool Equals(Type x, Type y)
    {            
        return x.IsAssignableFromType(y);
    }

    public override int GetHashCode(Type obj)
    {
        return obj.GetHashCode();
    }
}

1 个答案:

答案 0 :(得分:2)

您不能使用“assignable from”作为等效操作的比较器。

Equals具有依赖于它的类所采用的特定规则。如果你打破规则,使用这种比较器的结果基本上是随机的随机播放。

请参阅Guidelines for Overloading Equals()

  

x.Equals(x)返回true   x.Equals(y)返回与y.Equals(x)相同的值   如果(x.Equals(y) && y.Equals(z))返回true,则x.Equals(z)返回true。

我不确定如何解决您的具体情况,可能只需要将一种类型映射到另一种类型,只需要Dictionary<Type,Type>并将类型直接放到它上面。