代码之家  ›  专栏  ›  技术社区  ›  Nippysaurus

dictionary.containsKey()未按预期工作

  •  4
  • Nippysaurus  · 技术社区  · 15 年前

    我有一本字典。

    Dictionary<YMD, object> cache = new Dictionary<YMD, object>();
    

    YMD课程是我的发明之一,它只包含年、月和日期。其目的是按相关日期对数据进行索引。总之,我已经实现了equals()和compareto()函数,以及==和!=运算符。

    尽管如此,dictionary.containskey()函数将始终返回false,即使该键存在。

    我立即想到我的比较函数必须被破坏,但是在为所有这些函数编写单元测试之后,情况似乎并非如此。

    字典课有什么我不知道的吗?

    2 回复  |  直到 15 年前
        1
  •  16
  •   Marc Gravell    15 年前

    用字典, GetHashCode() 是至关重要的。为了平等的事物( Equals() == true )它 必须 返回相同的数字(但允许发生碰撞-即两个项目可以通过巧合返回相同的数字,但不被视为相等)。

    另外-哈希代码必须 当项目在字典中时更改。散列 readonly 价值观有利于这一点,但也可以选择:不要改变它!例如,如果您的equals/hashcode跨越实体 Name Id (例如),然后不要更改对象的属性,否则您可能再也看不到该记录(即使您与键在同一实例中传递)。

        2
  •  2
  •   unknown    15 年前

    您只需要覆盖 等于 几何编码 功能。
    GetHashCode最常见的实现是XOR(^)实例的所有数据成员。