Самый простой способ сравнить массивы в C #

В Java Arrays.equals () позволяет легко сравнивать содержимое двух основных массивов (перегрузки доступны для всех основных типов).

Есть ли такая вещь в C #? Есть ли «волшебный» способ сравнения содержимого двух массивов в C #?

Вы можете использовать SequenceEqual . Это работает для любого IEnumerable , а не только для массивов.

Используйте SequenceEqual в LINQ .

 int[] arr1 = new int[] { 1,2,3}; int[] arr2 = new int[] { 3,2,1 }; Console.WriteLine(arr1.SequenceEqual(arr2)); // false Console.WriteLine(arr1.Reverse().SequenceEqual(arr2)); // true 

Также для массивов (и кортежей) вы можете использовать новые интерфейсы из .NET 4.0: IStructuralComparable и IStructuralEquatable . Используя их, вы можете не только проверить равенство массивов, но и сравнить их.

 static class StructuralExtensions { public static bool StructuralEquals(this T a, T b) where T : IStructuralEquatable { return a.Equals(b, StructuralComparisons.StructuralEqualityComparer); } public static int StructuralCompare(this T a, T b) where T : IStructuralComparable { return a.CompareTo(b, StructuralComparisons.StructuralComparer); } } { var a = new[] { 1, 2, 3 }; var b = new[] { 1, 2, 3 }; Console.WriteLine(a.Equals(b)); // False Console.WriteLine(a.StructuralEquals(b)); // True } { var a = new[] { 1, 3, 3 }; var b = new[] { 1, 2, 3 }; Console.WriteLine(a.StructuralCompare(b)); // 1 } 

Для .NET 4.0 и выше вы можете сравнивать элементы в массиве или кортежах с помощью типа StructuralComparisons :

 object[] a1 = { "string", 123, true }; object[] a2 = { "string", 123, true }; Console.WriteLine (a1 == a2); // False (because arrays is reference types) Console.WriteLine (a1.Equals (a2)); // False (because arrays is reference types) IStructuralEquatable se1 = a1; //Next returns True Console.WriteLine (se1.Equals (a2, StructuralComparisons.StructuralEqualityComparer)); 

SequenceEqual вернет true только в том случае, если два условия или встретились.

  1. Они содержат одни и те же элементы.
  2. Элементы находятся в одном порядке.

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

Имеют ли значения2 все значения, содержащиеся в значениях1?

вы можете использовать метод расширения LINQ Enumerable.Except а затем проверить, имеет ли результат какое-либо значение. Вот пример

 int[] values1 = { 1, 2, 3, 4 }; int[] values2 = { 1, 2, 5 }; var result = values1.Except(values2); if(result.Count()==0) { //They are the same } else { //They are different } 

А также с помощью этого вы автоматически получаете разные предметы. Две птицы с одним камнем.

Имейте в виду, если вы выполните свой код, как это

 var result = values2.Except(values1); 

вы получите разные результаты.

В моем случае у меня есть локальная копия массива и вы хотите проверить, было ли что-либо удалено из исходного массива, поэтому я использую этот метод.

Для модульных тестов вы можете использовать CollectionAssert.AreEqual вместо Assert.AreEqual .

Это, наверное, самый простой способ.

поэкспериментировать? как насчет

 public void Linq78a() { int[] numbers1 = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; bool bb = numbers.Zip(numbers1, (a, b) => (a == b)).Any(p => !p); if (!bb) Console.WriteLine("Lists are equal (bb)"); else Console.WriteLine("Lists are not equal (bb)"); } 

Замените условие (a == b) на все, что вы хотели бы сравнить в a и b.

(это объединяет два примера из образцов Linq разработчиков MSDN )

Я сделал это в визуальных студиях, и он отлично работал; сравнивая индекс массивов по индексу с коротким кодом.

 private void compareButton_Click(object sender, EventArgs e) { int[] answer = { 1, 3, 4, 6, 8, 9, 5, 4, 0, 6 }; int[] exam = { 1, 2, 3, 6, 8, 9, 5, 4, 0, 7 }; int correctAnswers = 0; int wrongAnswers = 0; for (int index = 0; index < answer.Length; index++) { if (answer[index] == exam[index]) { correctAnswers += 1; } else { wrongAnswers += 1; } } outputLabel.Text = ("The matching numbers are " + correctAnswers + "\n" + "The non matching numbers are " + wrongAnswers); } 

выход будет; Соответствующие номера: 7 Несоответствующие числа: 3

Для некоторых приложений может быть лучше:

 string.Join("", arr1) == string.Join("", arr2) 

Вот странная реализация.

  static bool ArraysEqual(T[] a, T[] b) { int k = 0; return a.All(x => x.Equals(b[k++])); } 

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

 static class Extensions { public static bool ItemsEqual(this TSource[] array1, TSource[] array2) { if (array1 == null && array2 == null) return true; if (array1 == null || array2 == null) return false; return array1.Count() == array2.Count() && !array1.Except(array2).Any(); } } 

Код проверки выглядит так:

 class Program { static void Main(string[] args) { int[] a1 = new int[] { 1, 2, 3 }; int[] a2 = new int[] { 3, 2, 1 }; int[] a3 = new int[] { 1, 3 }; int[] a4 = null; int[] a5 = null; int[] a6 = new int[0]; Console.WriteLine(a1.ItemsEqual(a2)); // Output: True. Console.WriteLine(a2.ItemsEqual(a3)); // Output: False. Console.WriteLine(a4.ItemsEqual(a5)); // Output: True. No Exception. Console.WriteLine(a4.ItemsEqual(a3)); // Output: False. No Exception. Console.WriteLine(a5.ItemsEqual(a6)); // Output: False. No Exception. } } 
  • Сравнить не примитивные Длинные значения 127 и 128
  • .net ORM Сравнение
  • Сравните значения двух массивов - classического asp
  • Как проверить несколько переменных на значение?
  • в чем разница между json и xml
  • Как сделать сравнение строк без учета регистра?
  • Как сравнить две метки времени в формате «Месяц Дата hh: mm: ss», чтобы проверить + ve или -ve значение
  • Сортировка объектов Java с использованием нескольких ключей
  • Сравните двойную точность в задаче точности VBA
  • Инструмент для сравнения 2 двоичных файлов в Windows
  • Сравнить два списка для поиска общих элементов
  • Давайте будем гением компьютера.