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

c#中有这样的东西吗?在c#中是否存在比较两个数组内容的“神奇”方法?


当前回答

检查这个线程的答案,它将其中一个数组转换为HashSet,并使用SetEquals与另一个数组进行比较。 但是请注意,这并不检查顺序或副本。

其他回答

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

你可以使用Enumerable。相交:

int[] array1 = new int[] { 1, 2, 3, 4,5 },
      array2 = new int[] {7,8};

if (array1.Intersect(array2).Any())
    Console.WriteLine("matched");
else
    Console.WriteLine("not matched");

列表模式是在c# 11 . net 7 RC2中添加的。

int[] numbers = { 1, 2, 3 };

Console.WriteLine(numbers is [1, 2, 3]);  // True
Console.WriteLine(numbers is [1, 2, 4]);  // False

对于单元测试,可以使用CollectionAssert。AreEqual而不是assert。AreEqual。

这可能是最简单的方法。

假设数组相等意味着两个数组在相等的下标处有相等的元素,则有SequenceEqual答案和IStructuralEquatable答案。

但两者在性能方面都有缺点。

当数组长度不同时,. net Framework中的SequenceEqual实现将不会进行快捷操作,因此它可能会完全枚举其中一个数组,并比较其中的每个元素。 这就是说,取决于。net风格(比如。net 5),它可能会有快捷方式,请看这条评论。因此,对于一个最新的。net项目,SequenceEqual应该是一个不错的选择。

IStructuralEquatable不是通用的,可能会导致每个比较值的装箱。此外,它使用起来不是很简单,并且已经调用了一些helper方法来隐藏它。

从性能角度来看,使用如下代码可能会更好:

bool ArrayEquals<T>(T[] first, T[] second)
{
    if (first == second)
        return true;
    if (first == null || second == null)
        return false;
    if (first.Length != second.Length)
        return false;
    for (var i = 0; i < first.Length; i++)
    {
        if (!first[i].Equals(second[i]))
            return false;
    }
    return true;
}

当然,这也不是检查数组是否相等的“神奇方法”。

所以目前,不,在。net中并没有真正等价于Java Arrays.equals()的东西。