の実装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
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;
}
IEqualityComparer
from 入力パラメーターが使用されます。ここでは、入力しますが実装StructruralEqualityComparer
しint
ないため、値が等しいIStructruralEquatable
デフォルトの比較子が使用されます。int
StructruralEqualityComparer
ただし、構造的ではないため、入力する必要int
はありません。次を使用する必要があります。
(arr1 as IStructuralEquatable).Equals(arr2, EqualityComparer<int>.Default);
それはまだ動作します。StructruralEqualityComparer
配列内の項目が構造的である場合に使用する必要があります
要約すると、両方の実装は同じようなもので、どちらも値の等価性に基づいて 2 つの配列を反復int
して比較します。
より読みやすいため、LINQバージョンをお勧めします。