Различные результаты для сравнения Array [] [] с SequenceEqual () и пользовательского метода - PullRequest
0 голосов
/ 29 октября 2011

Может кто-нибудь объяснить мне, почему я получаю разные результаты?

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 из этого ответа и получил тот же результат.

Ответы [ 2 ]

3 голосов
/ 29 октября 2011

Они не эквивалентны.

SequenceEqual использует Equals для каждого элемента последовательности.Поскольку map является двумерным массивом, каждый «элемент» на самом деле является строкой, и это означает, что это Equals метод Array, который в итоге вызывается.

Ваш метод использует сравнение каждогоэлемент, непосредственно используя !=, что равно , что вы хотите.

Решением было бы предоставить пользовательский компаратор равенства для SequenceEquals.Затем указанный компаратор снова вызовет SequenceEquals.

2 голосов
/ 29 октября 2011

Полностью переписанный ответ

Прежде всего, два способа сравнения делают полностью разные вещи.

Ручное сравнение:

  • сравнивает все Rows * Cols элементов в вашем массиве
  • сравнивает, используя равенство ссылок (если тип элемента не переопределяет == и !=)

Сравнение SequenceEqual:

  • сравнивает только элементы непосредственно в каждом массиве; это означает, что он сравнивает Rows массивы с другими массивами!
  • сравнивает по телефону object.Equals

Расхождение в результате связано с тем, что SequenceEqual сводится к:

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

Это проверка на равенство ссылок . Это означает, что если map и other.map не являются массивами идентичных ссылочным под-массивов, SequenceEqual вернет false.

Live proof .

...