比较数组内容,SequenceEqual和StructuralComparisons.StructuralEqualityComparer的差异

Roy*_*mir 7 .net c# .net-4.0

我有2个数组:

        int[] arr1 = new int[] { 1, 2, 3 };
        int[] arr2 = new int[] { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

我需要检查它们是否相等(不是参考)

写作有什么区别:

        Console.WriteLine(arr1.SequenceEqual(arr2)); //true
Run Code Online (Sandbox Code Playgroud)

VS

        IStructuralEquatable eqArray1 = arr1;
        Console.WriteLine(eqArray1.Equals(arr2, StructuralComparisons.StructuralEqualityComparer));  //true
Run Code Online (Sandbox Code Playgroud)

两者都返回True ..

我什么时候应该使用?

cuo*_*gle 2

的实现SequenceEqual有点类似:

using (IEnumerator<TSource> enumerator1 = first.GetEnumerator())
using (IEnumerator<TSource> enumerator2 = second.GetEnumerator())
{
    while (enumerator1.MoveNext())
    {
        if (!enumerator2.MoveNext() || !comparer.Equals(enumerator1.Current, enumerator2.Current))
        {
            return false;
        }
    }

    if (enumerator2.MoveNext())
    {
        return false;
    }
}

return true;
Run Code Online (Sandbox Code Playgroud)

此默认SequenceEqual方法使用默认值EqualityComparer<int>.Defaultint其值相等。

Array实现IStructuralEquatable方法Equal

bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
{
    if (other == null) return false;

    if (!object.ReferenceEquals(this, other))
    {
        Array array = other as Array;
        if ((array == null) || (array.Length != this.Length))
        {
            return false;
        }
        for (int i = 0; i < array.Length; i++)
        {
            object x = this.GetValue(i);
            object y = array.GetValue(i);

            if (!comparer.Equals(x, y))
            {
                return false;
            }
        }
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

使用了fromIEqualityComparer输入参数,这里你输入StructruralEqualityComparerint没有实现IStructruralEquatable,所以它使用默认比较器,int其值相等。

但是,无需输入,StructruralEqualityComparer因为int不是结构性的,您应该只使用:

(arr1 as IStructuralEquatable).Equals(arr2, EqualityComparer<int>.Default);
Run Code Online (Sandbox Code Playgroud)

它仍然有效。StructruralEqualityComparer如果数组中的项目是结构性的,则应该使用

综上所述,两者的实现是相同的,都是基于值相等来迭代两个数组来int进行比较。

我更喜欢 LINQ 版本,因为它更具可读性。