2010-02-04 98 views
4

我有一本字典。Dictionary.ContainsKey()不按预期方式工作

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

YMD类是我的发明之一,它是一个只包含年份,月份和日期的类。目的是数据将被索引的日期与之相关。无论如何,我已经实现了Equals()和CompareTo()函数,以及==和!=运算符。

尽管如此,即使密钥存在,Dictionary.ContainsKey()函数也将始终返回false。

我马上认为我的比较函数必须被打破,但在为所有人编写单元测试之后,似乎并不是这样。

有没有关于字典类的东西,我不知道?

+0

是YMD的一个类还是一个struct? – 2010-02-04 06:11:50

+0

它是一个类。很确定字典没有比较类的引用,因为==操作符已被覆盖。 – Nippysaurus 2010-02-04 06:13:11

回答

16

随着字典,GetHashCode()是至关重要的。对于相同的东西(Equals() == true),它必须返回相同的数字(但它允许有冲突 - 即两个项目可以通过重合返回相同的数字,但不被视为等于)。

此外 - 哈希码必须而不是更改,而项目是在字典中。对readonly进行散列值对此非常有用,但也可以:只是不要更改它!例如,如果您的等号/散列码跨越实体NameId(比如说),那么不要更改对象的这些属性,否则您可能再也不会看到该记录(即使您将相同实例作为密钥传入) 。

+0

该对象是不可变的,所以散列不会改变。谢谢你的回答,发现:) – Nippysaurus 2010-02-04 06:17:47

2

您只需要覆盖等于GetHashcode函数。
GetHashcode的最常见实现是异或(^)所有实例的数据成员。