Array[][]与SequenceEqual()和自定义方法比较的结果不同

本文关键字:比较 结果 自定义方法 SequenceEqual Array | 更新日期: 2023-09-27 18:12:55

有人能解释一下为什么我得到不同的结果吗?

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从这个答案,并得到了相同的结果。

Array[][]与SequenceEqual()和自定义方法比较的结果不同

它们不相等。

SequenceEqual对序列的每个元素使用Equals。由于map是一个二维数组,每个"元素"实际上是一行,这意味着最终被调用的是ArrayEquals方法。

您的方法直接使用!=比较每个元素,是您想要的

一个解决方案是提供一个自定义的相等比较器来比较SequenceEquals。然后比较器将再次调用SequenceEquals。

完全改写的答案

首先,两种比较的方法完全不同。

手动比较:

  • 比较数组中所有Rows * Cols
  • 比较使用引用相等(除非项目类型覆盖==!=)

SequenceEqual比较:

  • 只比较每个数组中的项;这意味着它将Rows数组与其他数组进行比较!
  • 比较调用object.Equals

结果差异源于SequenceEqual归结为:

if(!oneArray.Equals(anotherArray)) {
    return false;
}

这是一个引用相等性检查。这意味着除非mapother.map是引用相同子数组的数组,否则SequenceEqual将返回false

<<p> 生活证明/strong>。