Как сравнить массивы в С#?

Возможный дубликат:
Самый простой способ сравнения массивов на С#

Как сравнить два массива в С#?

Я использую следующий код, но его результат ложный. Я ожидал, что это будет правда.

Array.Equals(childe1,grandFatherNode);

Ответ 1

Вы можете использовать Enumerable.SequenceEqual() в System.Linq для сравнения содержимого в массиве

bool isEqual = Enumerable.SequenceEqual(target1, target2);

Ответ 2

Вы сравниваете ссылки на объекты, и они не совпадают. Вам нужно сравнить содержимое массива.

Решение .NET2

Опция выполняет итерацию через элементы массива и вызывает Equals() для каждого элемента. Помните, что вам необходимо переопределить метод Equals() для элементов массива, если они не являются одной и той же ссылкой на объект.

Альтернативой является использование этого общего метода для сравнения двух общих массивов:

static bool ArraysEqual<T>(T[] a1, T[] a2)
{
    if (ReferenceEquals(a1, a2))
        return true;

    if (a1 == null || a2 == null)
        return false;

    if (a1.Length != a2.Length)
        return false;

    EqualityComparer<T> comparer = EqualityComparer<T>.Default;
    for (int i = 0; i < a1.Length; i++)
    {
        if (!comparer.Equals(a1[i], a2[i])) return false;
    }
    return true;
}

Решение .NET 3.5 или выше

Или используйте SequenceEqual, если Linq доступен для вас (.NET Framework >= 3.5)

Ответ 3

В классе Array нет статического метода Equals, поэтому вы фактически используете Object.Equals, который определяет, ссылаются ли эти два объекта на один и тот же объект.

Если вы хотите проверить, содержат ли массивы одни и те же элементы в одном порядке, вы можете использовать метод расширения SequenceEquals:

childe1.SequenceEqual(grandFatherNode)

Edit:

Чтобы использовать SequenceEquals с многомерными массивами, вы можете использовать расширение для их перечисления. Вот расширение для перечисления двухмерного массива:

public static IEnumerable<T> Flatten<T>(this T[,] items) {
  for (int i = 0; i < items.GetLength(0); i++)
    for (int j = 0; j < items.GetLength(1); j++)
      yield return items[i, j];
}

Использование:

childe1.Flatten().SequenceEqual(grandFatherNode.Flatten())

Если ваш массив имеет больше размеров, чем два, вам потребуется расширение, поддерживающее это число измерений. Если количество измерений меняется, вам понадобится немного более сложный код для циклического изменения количества измерений.

Сначала вы должны убедиться, что количество измерений и размер размеров массивов совпадают, прежде чем сравнивать содержимое массивов.

Изменить 2:

Оказывается, вы можете использовать метод OfType<T> для выравнивания массива, как заметил RobertS. Естественно, что это работает только в том случае, если все элементы могут быть приведены к одному типу, но это обычно так, если вы можете их сравнить. Пример:

childe1.OfType<Person>().SequenceEqual(grandFatherNode.OfType<Person>())

Ответ 4

Array.Equals сравнивает ссылки, а не их содержимое:

В настоящее время, когда вы сравниваете два массива с оператором =, мы действительно используем оператор System.Object =, который сравнивает только экземпляры. (т.е. это использует ссылочное равенство, поэтому оно будет справедливо только в том случае, если оба массива указывают на один и тот же экземпляр)

Источник

Если вы хотите сравнить содержимое массивов, вам нужно зациклиться на массивах и сравнить элементы.

В одном и том же блоге есть пример того, как это сделать.

Ответ 5

Метод Equals выполняет ссылочное сравнение - если массивы представляют собой разные объекты, это действительно вернет false.

Чтобы проверить, содержат ли массивы одинаковые значения (и в том же порядке), вам нужно будет перебирать их и проверять равенство для каждого.

Ответ 6

Array.Equals(), похоже, проверяет только те же экземпляры.

Не существует метода сравнения значений, но его было бы очень легко написать.

Просто сравните длины, если не равные, верните false. В противном случае проведите через каждое значение в массиве и определите, соответствуют ли они.