【问题标题】:Can two arrays which contain the same elements not be equal?包含相同元素的两个数组可以不相等吗?
【发布时间】:2013-04-14 18:43:35
【问题描述】:

我今天遇到了一个惊人的问题,我试图找出一个对象是否包含在 List 集合中。问题是列表没有找到该对象并返回索引为-1,而我已经可以在那里看到它。然后我创建了一个自定义 Index Finder 来通过比较属性而不是直接相等来查找对象,我发现对象的属性之一,一个相同的 ushort 数组在比较时返回 false,但它们包含完全相同的元素。

数组如下:

{ushort[1]} [0]13

它们在两者中完全相同,只是其中一个对象包含在 List 中,而另一个对象是自己的。这个问题的原因可能是什么?我已经尝试了各种不同的方法来解决这个问题,但我不能只是弄清楚问题是什么。在这种特殊情况下,是什么导致两个数组之间的比较返回 false,我使用 Object.equals 以及普通的 == 比较器进行了绑定。谢谢

【问题讨论】:

  • 这个{ushort[1]} [0]13是个什么样的数组?这是什么语法?
  • 对不起,只是在调试器中显示它。这意味着 1 个元素的 ushort 数组,第一个元素是 13

标签: c# arrays list c#-4.0


【解决方案1】:

对于数组,只有在比较指向同一数组的两个引用时,Equals 才会返回 true。要按内容比较不同的数组,可以使用:

 Enumerable.SequenceEqual(a1, a2)

此外,如果集合包含您的自定义类型的对象,请确保这些类型覆盖 Equals、相等运算符 (==) 和 GetHashCode。

【讨论】:

  • 我的天啊,我明白为什么这确实有效,但这会增加比较大型数组的时间。此外,它如何适用于某些类型的数组但不是全部?为什么在某些情况下它甚至找不到列表中的对象。
  • 对象只是一个类,它有一个 ushort 数组、一个 ushort 和一个 int 作为公共属性。绝对没有覆盖任何东西
  • 比较数组所花费的时间与数组大小成正比。关于有时比较有效有时无效的情况,可能在第一种情况下您正在比较同一个对象,而在第二种情况下您正在比较具有相同属性的两个不同对象。
  • 嗯,你是说相等比较器将原生数组视为对象?
  • 每个对象,包括数组和列表,都有自己的相等比较器,由 Equals 方法实现。默认实现,object.Equals,只比较对象的引用,而不比较它的内容。
猜你喜欢
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 2016-12-27
  • 2020-07-24
相关资源
最近更新 更多