如何在C#中比较数组?

mah*_*di 97 c# arrays compare

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

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

我使用以下代码,但结果是错误的.我期待它是真的.

Array.Equals(childe1,grandFatherNode);
Run Code Online (Sandbox Code Playgroud)

AMi*_*ing 212

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

bool isEqual = Enumerable.SequenceEqual(target1, target2);
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,我知道它有点晚了,但可以简化为:bool isEqual = target1.SequenceEqual(target2); (16认同)
  • AMing解决方案处理空案例(并且更"对称"). (8认同)
  • @Orace:实际上,如果任一参数为null,则Enumerable.SequenceEqual会给出异常. (5认同)
  • `Enumerable.SequenceEqual(x,y)`和`x.SequenceEqual(y)`的行为方式相同:如果第一个或第二个集合为空,它们抛出`ArgumentNullException`.只需看看[参考源上的实现](https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,0c673d96d87461e6). (3认同)

Dan*_*lba 36

您正在比较对象引用,它们并不相同.您需要比较数组内容.

.NET2解决方案

一个选项是迭代数组元素并调用Equals()每个元素.请记住Equals(),如果数组元素不是同一个对象引用,则需要覆盖它们的方法.

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

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;
}
Run Code Online (Sandbox Code Playgroud)

.NET 3.5或更高版本的解决方案

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

  • 我的数组是多维和SequenceEqual不适用于此类型 (2认同)

Guf*_*ffa 19

类中没有静态Equals方法Array,因此您实际使用的是Object.Equals确定两个对象引用是否指向同一对象.

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

childe1.SequenceEqual(grandFatherNode)
Run Code Online (Sandbox Code Playgroud)

编辑:

SequenceEquals与多维数组一起使用,可以使用扩展来枚举它们.这是枚举二维数组的扩展:

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];
}
Run Code Online (Sandbox Code Playgroud)

用法:

childe1.Flatten().SequenceEqual(grandFatherNode.Flatten())
Run Code Online (Sandbox Code Playgroud)

如果您的数组的维度超过两个,则需要一个支持该维数的扩展.如果维度的数量不同,则需要更复杂的代码来循环可变数量的维度.

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

编辑2:

事实证明,你可以使用该OfType<T>方法来展平数组,正如RobertS指出的那样.当然,只有当所有项目实际上都可以转换为相同类型时才有效,但如果你可以比较它们通常就是这种情况.例:

childe1.OfType<Person>().SequenceEqual(grandFatherNode.OfType<Person>())
Run Code Online (Sandbox Code Playgroud)


Chr*_*isF 7

Array.Equals 比较参考文献,而不是它们的内容:

目前,当您使用=运算符比较两个数组时,我们实际上使用的是System.Object的=运算符,它仅比较实例.(即,它使用引用相等,因此只有当两个数组都指向完全相同的实例时才会成立)

资源

如果要比较数组的内容,则需要循环遍历数组并比较元素.

同一博客文章中有一个如何执行此操作的示例.