Возможный дубликат:
Самый простой способ сравнения массивов на С#
Как сравнить два массива в С#?
Я использую следующий код, но его результат ложный. Я ожидал, что это будет правда.
Array.Equals(childe1,grandFatherNode);
Возможный дубликат:
Самый простой способ сравнения массивов на С#
Как сравнить два массива в С#?
Я использую следующий код, но его результат ложный. Я ожидал, что это будет правда.
Array.Equals(childe1,grandFatherNode);
Вы можете использовать Enumerable.SequenceEqual() в System.Linq для сравнения содержимого в массиве
bool isEqual = Enumerable.SequenceEqual(target1, target2);
Вы сравниваете ссылки на объекты, и они не совпадают. Вам нужно сравнить содержимое массива.
Опция выполняет итерацию через элементы массива и вызывает 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;
}
Или используйте SequenceEqual, если Linq доступен для вас (.NET Framework >= 3.5)
В классе Array
нет статического метода Equals
, поэтому вы фактически используете Object.Equals
, который определяет, ссылаются ли эти два объекта на один и тот же объект.
Если вы хотите проверить, содержат ли массивы одни и те же элементы в одном порядке, вы можете использовать метод расширения SequenceEquals
:
childe1.SequenceEqual(grandFatherNode)
Чтобы использовать 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())
Если ваш массив имеет больше размеров, чем два, вам потребуется расширение, поддерживающее это число измерений. Если количество измерений меняется, вам понадобится немного более сложный код для циклического изменения количества измерений.
Сначала вы должны убедиться, что количество измерений и размер размеров массивов совпадают, прежде чем сравнивать содержимое массивов.
Оказывается, вы можете использовать метод OfType<T>
для выравнивания массива, как заметил RobertS. Естественно, что это работает только в том случае, если все элементы могут быть приведены к одному типу, но это обычно так, если вы можете их сравнить. Пример:
childe1.OfType<Person>().SequenceEqual(grandFatherNode.OfType<Person>())
Array.Equals
сравнивает ссылки, а не их содержимое:
В настоящее время, когда вы сравниваете два массива с оператором =, мы действительно используем оператор System.Object =, который сравнивает только экземпляры. (т.е. это использует ссылочное равенство, поэтому оно будет справедливо только в том случае, если оба массива указывают на один и тот же экземпляр)
Если вы хотите сравнить содержимое массивов, вам нужно зациклиться на массивах и сравнить элементы.
В одном и том же блоге есть пример того, как это сделать.
Метод Equals
выполняет ссылочное сравнение - если массивы представляют собой разные объекты, это действительно вернет false.
Чтобы проверить, содержат ли массивы одинаковые значения (и в том же порядке), вам нужно будет перебирать их и проверять равенство для каждого.
Array.Equals(), похоже, проверяет только те же экземпляры.
Не существует метода сравнения значений, но его было бы очень легко написать.
Просто сравните длины, если не равные, верните false. В противном случае проведите через каждое значение в массиве и определите, соответствуют ли они.