如何比较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。 否则,循环访问数组中的每个值,并确定它们是否匹配。