Arraylist在从磁盘加载后无法比较对象

时间:2010-04-26 06:10:59

标签: c# arraylist

为了方便起见,我们假设我有一个arraylist allBooks包含课程“书籍”和arraylist someBooks包含一些但不是全部的“书籍”。

当我想查看一个arraylist中的书是否也包含在另一个arraylist中时,使用contains()方法工作正常。

问题在于,当我将两个Arraylists保存到.bin文件并在程序重新启动后加载它们时,这不再起作用了。执行与以前相同的测试,即使比较的对象相同(内部具有相同的信息),contains()也返回false。

我通过重载equals方法解决了它并且工作正常,但我想知道为什么会发生这种情况?

4 个答案:

答案 0 :(得分:6)

您必须提供自己的哈希码并等于实现。默认情况下,它只会使用指针相等,这在对象被“克隆”(序列化/反序列化循环)后显然会失败。

答案 1 :(得分:2)

当您最初创建列表时,它们都包含对相同对象的引用,但是当您将它们加载回来时,它们都获得了相同对象的单独副本。由于每个列表都有单独的副本,因此它们不包含相同的引用,这意味着它们不会在没有重载正确方法的情况下进行比较。

答案 2 :(得分:2)

这听起来像是引用平等vs Equals的常见问题,在序列化中尤为常见。适当地覆盖Equals(和GetHashCode),您应该重新开始营业。

有关信息,除非您使用的是.NET 1.1(或微框架),或者有充分理由这样做,否则使用ArrayList 通常可以避免 。更喜欢通用类型集合,例如List<T>

答案 3 :(得分:1)

假设book是一个对象,默认情况下Equals检查引用是否相等。加载新对象时不会出现这种情况。覆盖Equals方法是一种正确的方法 其他选项是将Book更改为结构,或使用更现代的容器,如字典或哈希表,您可以按ID存储书籍。