有人可以解释我为什么会得到不同的结果吗?
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
I overwrote Equals()
, GetHashCode()
, ==
and !=
for the type to be compared。我还尝试了CollectionComparer
来自this的答案,并得到了相同的结果。
答案 0 :(得分:3)
他们不等同。
SequenceEqual
对序列的每个元素使用Equals
。由于map
是一个二维数组,因此每个“元素”实际上都是一行,这意味着最终被调用的是Equals
的{{1}}方法。
您的方法使用Array
直接比较每个元素,是您想要的。
解决方案是为SequenceEquals提供自定义相等比较器。然后,所述比较器将再次调用SequenceEquals。
答案 1 :(得分:2)
首先,比较两种方法完全不同的东西。
手动比较:
Rows * Cols
项==
和!=
) SequenceEqual
比较:
Rows
数组与其他数组进行比较!object.Equals
结果差异源于SequenceEqual
归结为:
if(!oneArray.Equals(anotherArray)) {
return false;
}
That's a reference equality check。这意味着除非map
和other.map
是引用相同的子数组的数组,否则SequenceEqual
将返回false
。
<强> Live proof 强>