我有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 ..
我什么时候应该使用?
的实现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>.Default,int其值相等。
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输入参数,这里你输入StructruralEqualityComparer但int没有实现IStructruralEquatable,所以它使用默认比较器,int其值相等。
但是,无需输入,StructruralEqualityComparer因为int不是结构性的,您应该只使用:
(arr1 as IStructuralEquatable).Equals(arr2, EqualityComparer<int>.Default);
Run Code Online (Sandbox Code Playgroud)
它仍然有效。StructruralEqualityComparer如果数组中的项目是结构性的,则应该使用
综上所述,两者的实现是相同的,都是基于值相等来迭代两个数组来int进行比较。
我更喜欢 LINQ 版本,因为它更具可读性。
| 归档时间: |
|
| 查看次数: |
3828 次 |
| 最近记录: |