最简单的方法来比较C#中的数组

在Java中, Arrays.equals()允许轻松地比较两个基本数组的内容(重载可用于所有基本types)。

C#中有这样的事情吗? 有没有比较C#中的两个数组的内容的“魔术”方式?

你可以使用SequenceEqual 。 这适用于任何IEnumerable<T> ,而不仅仅是数组。

在LINQ中使用SequenceEqual。

 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<T>(this T a, T b) where T : IStructuralEquatable { return a.Equals(b, StructuralComparisons.StructuralEqualityComparer); } public static int StructuralCompare<T>(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及更高版本,可以使用StructuralComparisonstypes比较数组或元组中的元素:

 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. 元素的顺序是相同的。

如果你只想检查它们是否包含相同的元素,而不pipe它们的顺序和你的问题的types

values2是否包含values1中包含的所有值?

你可以使用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); 

你会得到不同的结果。

在我的情况下,我有一个数组的本地副本,并希望检查是否有任何东西已经从原始数组中删除,所以我使用这种方法。

对于unit testing,可以使用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中比较的任何东西来replace(a == b)条件。

(这个例子结合了MSDN开发者Linq的两个例子)

对于某些应用可能会更好:

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

这是一个奇怪的实现。

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

我在视觉工作室做了这个,它完美的工作。 比较数组索引与简短的代码。

 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

如果您想要优雅地处理nullinput,并忽略项目的顺序,请尝试以下解决scheme:

 static class Extensions { public static bool ItemsEqual<TSource>(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(); } } 

testing代码如下所示:

 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. } }