如何比较C#中的数组?

可能重复:
最简单的方法来比较C#中的数组

我如何比较C#中的两个数组?

我使用下面的代码,但它的结果是错误的。 我期待这是真的。

Array.Equals(childe1,grandFatherNode); 

您可以使用System.Linq中的Enumerable.SequenceEqual()来比较数组中的内容

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

你比较的对象引用 ,他们是不一样的。 您需要比较数组内容。

.NET2解决scheme

一个选项遍历数组元素,并为每个元素调用Equals() 。 请记住,如果它们不是相同的对象引用,则需要重写数组元素的Equals()方法。

另一种方法是使用这个generics方法来比较两个generics数组:

 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或更高版本的解决scheme

或者,如果Linq可用,则使用SequenceEqual (.NET Framework> = 3.5)

Array类中没有静态的Equals方法,所以你使用的实际上是Object.Equals ,它决定了两个对象引用是否指向同一个对象。

如果要检查数组是否包含相同顺序的相同项目,则可以使用SequenceEquals扩展方法:

 childe1.SequenceEqual(grandFatherNode) 

编辑:

要将SequenceEquals用于multidimensional array,可以使用扩展名来枚举它们。 这是一个枚举二维数组的扩展:

 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,则需要一个支持该维数的扩展。 如果维数不同,则需要更复杂的代码来循环可变数量的维。

在比较数组的内容之前,当然首先要确保维数和维的大小匹配。

编辑2:

原来,你可以使用OfType OfType<T>方法来平整一个数组,如RobertS指出的那样。 当然,只有当所有的物品都可以转换成相同的types时才有效,但是通常情况下,如果你可以比较它们的话。 例:

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

Array.Equals比较引用,而不是它们的内容:

目前,当您使用=运算符比较两个数组时,我们确实在使用System.Object的=运算符,它只比较实例。 (即,这使用引用相等,所以只有当两个数组指向完全相同的实例)

资源

如果要比较数组的内容 ,则需要循环访问数组并比较元素。

同样的博客文章有一个如何做到这一点的例子。

Equals方法进行引用比较 – 如果数组是不同的对象,这将确实返回false。

要检查数组是否包含相同的值(以相同的顺序),您需要对它们进行迭代并testing它们之间是否相等。

Array.Equals()似乎只testing相同的实例。

似乎没有一种方法可以比较这些值,但写起来很容易。

只要比较长度,如果不相等,则返回false。 否则,循环访问数组中的每个值,并确定它们是否匹配。