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

时间:2011-10-28 21:07:11

标签: c# multidimensional-array equals

有人可以解释我为什么会得到不同的结果吗?

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

2 个答案:

答案 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。这意味着除非mapother.map是引用相同的子数组的数组,否则SequenceEqual将返回false

<强> Live proof