有人能解释一下为什么我得到不同的结果吗?
bool result = true;
for (int row = 0; row < State.Rows; row++)
{
for (int col = 0; col < State.Cols; col++)
{
if (map[row][col] != other.map[row][col])
//if (!map[row][col].Equals(other.map[row][col]))
result = false;
}
}
bool sequenceEqual = map.SequenceEqual(other.map);
//result = true
//sequenceEqual = false
我覆盖了Equals()
, GetHashCode()
, ==
和!=
作为比较类型。我也尝试了CollectionComparer
从这个答案,并得到了相同的结果。
它们不相等。
SequenceEqual
对序列的每个元素使用Equals
。由于map
是一个二维数组,每个"元素"实际上是一行,这意味着最终被调用的是Array
的Equals
方法。
您的方法直接使用!=
比较每个元素,是您想要的。
一个解决方案是提供一个自定义的相等比较器来比较SequenceEquals。然后比较器将再次调用SequenceEquals。
完全改写的答案
首先,两种比较的方法完全不同。
手动比较:
- 比较数组中所有
Rows * Cols
项 - 比较使用引用相等(除非项目类型覆盖
==
和!=
)
SequenceEqual
比较:
- 只比较每个数组中的项;这意味着它将
Rows
数组与其他数组进行比较! - 比较调用
object.Equals
结果差异源于SequenceEqual
归结为:
if(!oneArray.Equals(anotherArray)) {
return false;
}
这是一个引用相等性检查。这意味着除非map
和other.map
是引用相同子数组的数组,否则SequenceEqual
将返回false
。