我有一个带有自定义比较器的类型字典(字典),因为我们要存储2个给定类型之间的关系(对于MVVM模式),并且我需要帮助以寻求一种使自定义EqualityComparer正常工作的方法。
做一些研究,我发现GetHashCode方法在Equals方法之前被调用,我如何正确获得哈希码?预期的行为是,如果我尝试从字典中获取“Square”,并且它具有“GeometricShape”已经存在,它返回“GeometricShape”的值,我找不到以给定预期结果的方式对其进行哈希处理的方法
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();
}
}
最佳答案
您不能使用将“assignable from”用作等效操作的比较器。Equals
具有依赖于它的类所假定的特定规则。如果违反了规则,使用这种比较器的结果本质上将是随机混洗。
参见Guidelines for Overloading Equals()
x.Equals(x)
returns true.
x.Equals(y)
returns the same value asy.Equals(x)
if(x.Equals(y) && y.Equals(z))
returns true, thenx.Equals(z)
returns true.
我不太确定如何解决您的特殊情况,也许如果您只需要将一种类型映射到另一种类型,则只需使用
Dictionary<Type,Type>
并将类型直接放入其中即可。
关于c# - EqualityComparer <Type> GetHashCode和等于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40730997/