Вы правы, почему SequenceEqual()
терпит неудачу. Массивы в C # являются ссылочными типами, что означает, что при их сравнении вы получаете reference равенство, что означает, что CLR проверяет, являются ли они в буквальном смысле одним и тем же объектом в памяти (два object[,]
s являются различными объектамив памяти.)
Кроме того, SequenceEqual()
выполняет итерацию по самым внешним элементам object[]
, но не может проникнуть в содержимое этих массивов для итерации по внутреннему object[,]
.
Вам необходимо значение равенства, чтобы вы могли сравнивать значения объектов, а не их ссылки.
Однако, поскольку вы используете object
s для всего, вы 'не получим равного значения, даже если объекты на самом деле ints
. Посмотрите этот пример в интерактивном окне C #:
> object object1 = 1;
> object object2 = 1;
> object1 == object2
false
> (int)object1 == (int)object2
true
Вам нужно будет преобразовать отдельные значения обратно в int
s, прежде чем вы сможете сделать правильное сравнение с ними. В любом случае, я бы порекомендовал использовать массивы int
, просто для лучшей безопасности типов (и, возможно, чуть-чуть лучшей производительности, если не выполнять кучу преобразований в боксы).
При этом общий подход заключается впереберите каждый отдельный элемент и сравните их по отдельности. Если они int
s в object[,]
массивах, убедитесь, что сначала их разыграли ((int)
). Что касается реализации этого сравнения, у вас есть несколько вариантов.
Вы можете реализовать свой собственный содержащий класс, как вы уже упоминали. В этом случае вы можете переопределить / реализовать интерфейсы для обеспечения необходимой вам функциональности. Вы также можете реализовать автономный вспомогательный метод (например, public void ArrayCompare(object[,] arr1, object[,] arr2)
).
Я реализовал пример в качестве метода расширения, который позволит вам использовать ArrayExtension.ArrayCompare(actual, expected)
или actual.ArrayCompare(expected)
для использованияит.
public static class ArrayExtension
{
public static bool ArrayCompare(this object[,] arr1, object[,] arr2)
{
if (arr1.Rank != arr2.Rank) return false;
var numDims = arr1.Rank;
for(var i = 0; i < numDims; i++)
if (arr1.GetLength(i) != arr2.GetLength(i))
return false;
for(var j = 0; j < numDims; j++)
{
var dimLength = arr1.GetLength(j);
for(var k = 0; k < dimLength; k++)
if ((int)arr1[j, k] != (int)arr2[j, k])
return false;
}
return true;
}
}