C# 比较数组[][]与SequenceEqual()和自定义方法的不同结果
有人能解释一下为什么我会得到不同的结果吗C# 比较数组[][]与SequenceEqual()和自定义方法的不同结果,c#,multidimensional-array,equals,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]
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
bool结果=true;
for(int row=0;row
。我还尝试了答案中的CollectionComparer
,得到了相同的结果。完全重写了答案
首先,这两种比较方法做的事情完全不同
手动比较:
- 比较数组中的所有
项行*col
- 使用引用相等进行比较(除非项目类型覆盖
和=
)!=
SequenceEqual
比较:
- 仅直接比较每个数组中的项;这意味着它将
数组与其他数组进行比较李>行
- 通过调用
object.Equals进行比较
SequenceEqual
归结为:
if(!oneArray.Equals(anotherArray)) {
return false;
}
。这意味着除非map
和other.map
是参考相同子数组的数组,SequenceEqual
将返回false
完全重写了答案
首先,这两种比较方法做的事情完全不同
手动比较:
- 比较数组中的所有
项行*col
- 使用引用相等进行比较(除非项目类型覆盖
和=
)!=
SequenceEqual
比较:
- 仅直接比较每个数组中的项;这意味着它将
数组与其他数组进行比较李>行
- 通过调用
object.Equals进行比较
SequenceEqual
归结为:
if(!oneArray.Equals(anotherArray)) {
return false;
}
。这意味着除非map
和other.map
是参考相同子数组的数组,SequenceEqual
将返回false
它们不是等价物
SequenceEqual
对序列的每个元素使用Equals
。由于map
是一个二维数组,因此每个“元素”实际上都是一行,这意味着最终被调用的是array
的等于方法
您的方法使用直接比较每个元素=代码>,这是您想要的
解决方案是为SequenceEquals提供自定义相等比较器。比较器会再次调用SequenceEquals。它们不是等价的
SequenceEqual
对序列的每个元素使用Equals
。由于map
是一个二维数组,因此每个“元素”实际上都是一行,这意味着最终被调用的是array
的等于方法
您的方法使用直接比较每个元素=代码>,这是您想要的
解决方案是为SequenceEquals提供自定义相等比较器。比较器将再次调用SequenceEquals。正如您所看到的,我尝试了Equals和运算符的两种实现,并重写了它们,结果没有改变。@BeatMe:“重写实现”是什么意思?写得太多做什么?这是所比较类型的实现。正如您所看到的,我尝试了Equals和运算符的实现并重写了它们,结果没有改变。@BeatMe:“重写实现”是什么意思?写得太多做什么?这是ComparedHanks类型的实现,现在确实得到了相同的结果。不知何故,我认为sequenceEqual只比较所有的子元素。是的,但使用Equals
。问题是,Array.Equals
没有。谢谢,现在确实得到了相同的结果。不知何故,我认为sequenceEqual只比较所有的子元素。是的,但使用Equals
。问题是,Array.Equals
没有。