gpt4 book ai didi

c# - 比较数组内容,SequenceEqual 和 StructuralComparisons.StructuralEqualityComparer 的区别

转载 作者:太空狗 更新时间:2023-10-29 20:31:16 27 4
gpt4 key购买 nike

我有 2 个数组:

        int[] arr1 = new int[] { 1, 2, 3 };
int[] arr2 = new int[] { 1, 2, 3 };

我需要检查它们是否相等(不是通过 ref)

写法有什么区别:

        Console.WriteLine(arr1.SequenceEqual(arr2)); //true

对比

        IStructuralEquatable eqArray1 = arr1;
Console.WriteLine(eqArray1.Equals(arr2, StructuralComparisons.StructuralEqualityComparer)); //true

两者都返回 True..

什么时候应该使用 each ?

最佳答案

执行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;

默认SequenceEqual方法使用默认 EqualityComparer<int>.Default对于 int这就是值(value)平等。

Array实现 IStructuralEquatableEqual方法:

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;
}

IEqualityComparer使用 from 输入参数,在这里输入 StructruralEqualityComparer但是int不执行 IStructruralEquatable , 所以它使用 int 的默认比较器这就是值(value)平等。

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

(arr1 as IStructuralEquatable).Equals(arr2, EqualityComparer<int>.Default);

它仍然有效。你应该使用 StructruralEqualityComparer如果数组中的项目结构化

所以总而言之,两者的实现有点相同,都是基于 int 的值相等性来迭代两个数组进行比较。

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

关于c# - 比较数组内容,SequenceEqual 和 StructuralComparisons.StructuralEqualityComparer 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12659769/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com