I don't believe there's anything in the framework which will give array equality in the way you'd want. However, it's not too hard to write your own implementation of IEqualityComparer<T> for arrays. For example (compiled but untested):
public static class ArrayEqualityComparer
{
public static IEqualityComparer<T[]> Create<T>(
IEqualityComparer<T> comparer)
{
return new ArrayEqualityComparer<T>(comparer);
}
}
public sealed class ArrayEqualityComparer<T> : IEqualityComparer<T[]>
{
private static readonly IEqualityComparer<T[]> defaultInstance = new
ArrayEqualityComparer<T>();
public static IEqualityComparer<T[]> Default
{
get { return defaultInstance; }
}
private readonly IEqualityComparer<T> elementComparer;
public ArrayEqualityComparer() : this(EqualityComparer<T>.Default)
{
}
public ArrayEqualityComparer(IEqualityComparer<T> elementComparer)
{
this.elementComparer = elementComparer;
}
public bool Equals(T[] x, T[] y)
{
if (x == y)
{
return true;
}
if (x == null || y == null)
{
return false;
}
if (x.Length != y.Length)
{
return false;
}
for (int i = 0; i < x.Length; i++)
{
if (!elementComparer.Equals(x[i], y[i]))
{
return false;
}
}
return true;
}
public int GetHashCode(T[] array)
{
if (array == null)
{
return 0;
}
int hash = 23;
foreach (T item in array)
{
hash = hash * 31 + elementComparer.GetHashCode(item);
}
return hash;
}
}
(Note that this currently assumes that elementComparer will cope with null values for both GetHashCode and Equals. The interface doesn't guarantee that, but the default equality comparers actually do handle it. You could modify the above code to be more robust, of course... I just don't have time right now.)
Usage:
IEqualityComparer<byte[]> x = ArrayEqualityComparer<byte>.Default;
bool equal = x.Equals(bytes1, bytes2);
IEqualityComparer<string[]> y =
ArrayEqualityComparer.Create(StringComparer.OrdinalIgnoreCase);
bool whatever = x.Equals(new[][] { "X", "Y" }, new[] { "x", "y" });