在C#中testing数组的相等性

我有两个数组。 例如:

int[] Array1 = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; int[] Array2 = new[] {9, 1, 4, 5, 2, 3, 6, 7, 8}; 

确定它们是否具有相同元素的最好方法是什么?

通过使用LINQ,你可以实现它的expression和性能:

 var q = from a in ar1 join b in ar2 on a equals b select a; bool equals = ar1.Length == ar2.Length && q.Count() == ar1.Length; 

您也可以使用SequenceEqual ,只要IEnumerable对象先sorting。

 int[] a1 = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int[] a2 = new[] { 9, 1, 4, 5, 2, 3, 6, 7, 8 }; bool equals = a1.OrderBy(a => a).SequenceEqual(a2.OrderBy(a => a)); 

价值观是否永远是独一无二的? 如果是这样,那么(如何检查等长):

 var set = new HashSet<int>(array1); bool allThere = array2.All(set.Contains); 

使用扩展方法(在3.0中是新的)。 如果两个数组的交点的长度等于它们的联合的长度,那么数组是相等的。

 bool equals = arrayA.Intersect(arrayB).Count() == arrayA.Union(arrayB).Count() 

简洁。

有关最有效的方法(请参阅Microsoft代码),请参阅堆栈溢出问题比较两个集合是否相等,而不pipe其中的项目顺序如何

 var shared = arr1.Intersect(arr2); bool equals = arr1.Length == arr2.Length && shared.Count() == arr1.Length; 

Framework 4.0引入了IStructuralEquatable接口,它有助于比较数组或元组等types:

  class Program { static void Main() { int[] array1 = { 1, 2, 3 }; int[] array2 = { 1, 2, 3 }; IStructuralEquatable structuralEquator = array1; Console.WriteLine(array1.Equals(array2)); // False Console.WriteLine(structuralEquator.Equals(array2, EqualityComparer<int>.Default)); // True // string arrays string[] a1 = "abcdefg".Split(); string[] a2 = "ABCDEFG".Split(); IStructuralEquatable structuralEquator1 = a1; bool areEqual = structuralEquator1.Equals(a2, StringComparer.InvariantCultureIgnoreCase); Console.WriteLine("Arrays of strings are equal:"+ areEqual); //tuples var firstTuple = Tuple.Create(1, "aaaaa"); var secondTuple = Tuple.Create(1, "AAAAA"); IStructuralEquatable structuralEquator2 = firstTuple; bool areTuplesEqual = structuralEquator2.Equals(secondTuple, StringComparer.InvariantCultureIgnoreCase); Console.WriteLine("Are tuples equal:" + areTuplesEqual); IStructuralComparable sc1 = firstTuple; int comparisonResult = sc1.CompareTo(secondTuple, StringComparer.InvariantCultureIgnoreCase); Console.WriteLine("Tuples comarison result:" + comparisonResult);//0 } } 

我发现这里详细的解决scheme是一个非常干净的方式,虽然有些人有点冗长。

最好的事情是,它也适用于其他IEnumerables。

这将检查每个数组按顺序包含相同的值。

 int[] ar1 = { 1, 1, 5, 2, 4, 6, 4 }; int[] ar2 = { 1, 1, 5, 2, 4, 6, 4 }; var query = ar1.Where((b, i) => b == ar2[i]); Assert.AreEqual(ar1.Length, query.Count()); 
  public static bool ValueEquals(Array array1, Array array2) { if( array1 == null && array2 == null ) { return true; } if( (array1 == null) || (array2 == null) ) { return false; } if( array1.Length != array2.Length ) { return false; } if( array1.Equals(array2)) { return true; } else { for (int Index = 0; Index < array1.Length; Index++) { if( !Equals(array1.GetValue(Index), array2.GetValue(Index)) ) { return false; } } } return true; }