Ответ 1
Подход Кэти кажется мне хорошим. Я бы лично разрешил конкретному указателю:
bool AreEqual<T>(T[] a, T[] b)
{
return AreEqual(a, b, EqualityComparer<T>.Default);
}
bool AreEqual<T>(T[] a, T[] b, IEqualityComparer<T> comparer)
{
// Handle identity comparison, including comparing nulls
if (a == b)
{
return true;
}
if (a == null || b == null)
{
return false;
}
if(a.Length != b.Length)
{
return false;
}
for(int i = 0; i < a.Length; i++)
{
if(!comparer.Equals(a[i], b[i]))
{
return false;
}
}
return true;
}
SequenceEqual, упомянутый CMS, хорош, но из-за его общности над IEnumerable<T>
я не думаю, что он может сделать "раньше", если длина не равна. (Возможно, он проверяет обе последовательности, реализующие IList, хотя, чтобы напрямую проверять Count.) Вы могли бы обобщить немного больше, чтобы использовать IList<T>
bool AreEqual<T>(IList<T> a, IList<T> b, IEqualityComparer<T> comparer)
{
if(a.Count != b.Count)
{
return false;
}
for(int i = 0; i < a.Count; i++)
{
if(!comparer.Equals(a[i], b[i]))
{
return false;
}
}
return true;
}
Прямая версия массива, вероятно, будет наиболее эффективной - добавление общности и абстракции обычно сказывается на производительности, хотя значительная ли она будет зависеть от вашего приложения.