【问题标题】:EqualityComparer<Type> GetHashCode and EqualsEqualityComparer<Type> GetHashCode 和 Equals
【发布时间】:2016-11-21 23:03:03
【问题描述】:

我有一个带有自定义比较器的类型字典 (Dictionary),因为我们想要存储 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();
    }
}

【问题讨论】:

  • 这个问题需要澄清一下。您是否试图告诉字典,如果您访问键 X(不在字典上)并且它具有键 X',它应该返回后者的值?如果是这样,您是否知道您将无法添加可分配给已在 Dictionary 中的另一个键的键?
  • 我有一种感觉(虽然我可能是错的)你试图使用错误的工具来完成这项工作。你能解释一下你想用这个实现什么吗?
  • MVVM 和字典。那是代码的味道。我首先建议您改用 KeyedCollections,或者完全消除对键控集合的需要。至于您要等同于什么……完全不确定。

标签: c# dictionary mvvm hashcode iequalitycomparer


【解决方案1】:

您不能拥有使用“可赋值自”作为等效操作的比较器。

Equals 具有依赖于它的类所采用的特定规则。如果您违反规则,使用此类比较器的结果基本上是随机洗牌。

Guidelines for Overloading Equals()

x.Equals(x) 返回 true。
x.Equals(y) 返回与 y.Equals(x) 相同的值
如果(x.Equals(y) &amp;&amp; y.Equals(z)) 返回真,那么x.Equals(z) 返回真。

我不太确定如何解决您的特殊情况,如果您只需要将一种类型映射到另一种类型,您只需拥有 Dictionary&lt;Type,Type&gt; 并将类型直接放入其中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2021-05-18
    • 2012-01-26
    • 2012-03-20
    相关资源
    最近更新 更多