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