Менин эки массивим бар жана аларда бир эле нерселер бар-жогун билгим келет. Барабар (object obj)
иштебейт, анткени массив шилтеме түрү болуп саналат. Мен өз аракетимди төмөндө жарыяладым, бирок бул жалпы иш экендигине көзүм жеткендиктен, андан дагы жакшы сыноо бар же жок экендигин билгим келет.
public bool ContainsEquivalentSequence<T>(T[] array1, T[] array2)
{
bool a1IsNullOrEmpty = ReferenceEquals(array1, null) || array1.Length == 0;
bool a2IsNullOrEmpty = ReferenceEquals(array2, null) || array2.Length == 0;
if (a1IsNullOrEmpty) return a2IsNullOrEmpty;
if (a2IsNullOrEmpty || array1.Length != array2.Length) return false;
for (int i = 0; i < array1.Length; i++)
if (!Equals(array1[i], array2[i]))
return false;
return true;
}
I булагын чагылдырган жана ал циклди аткарганга чейинки узундукту салыштырбайт . Бул ыкма T []
үчүн эмес, көбүнчө IEnumerable
үчүн иштелип чыккандыктан, бул мааниге ээ.
public static bool SequenceEqual<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
{
if (comparer == null)
{
comparer = EqualityComparer<TSource>.Default;
}
if (first == null)
{
throw Error.ArgumentNull("first");
}
if (second == null)
{
throw Error.ArgumentNull("second");
}
using (IEnumerator<TSource> enumerator = first.GetEnumerator())
{
using (IEnumerator<TSource> enumerator2 = second.GetEnumerator())
{
while (enumerator.MoveNext())
{
if (!enumerator2.MoveNext() || !comparer.Equals(enumerator.Current, enumerator2.Current))
{
return false;
}
}
if (enumerator2.MoveNext())
{
return false;
}
}
}
return true;
}