我认为Kathy的方法不错。我个人会允许明确指定比较器:
bool AreEqual<T>(T[] a, T[] b)
{
return AreEqual(a, b, EqualityComparer<T>.Default);
}
bool AreEqual<T>(T[] a, T[] b, IEqualityComparer<T> comparer)
{
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;
}
如CMS所提到的那样,SequenceEqual很好,但由于它适用于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;
}
直接使用数组版本可能是最有效的 - 添加通用性和抽象通常会影响性能,尽管是否显著取决于您的应用程序。