No creo que haya nada en el marco que le proporcione igualdad de matrices en la forma que usted desearía. Sin embargo, no es demasiado difícil escribir su propia implementación de IEqualityComparer<T>
para arreglos. Por ejemplo (compilado pero no probado):
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;
}
}
(Tenga en cuenta que esto supone actualmente que elementComparer
hará frente a los valores nulos, tanto para GetHashCode
y Equals
La interfaz no garantiza que, aunque los comparadores de igualdad predeterminado realidad lo hacen. . manejarlo se podría modificar el código anterior para ser más robusto, por supuesto ... es que no tengo tiempo ahora)
Uso:.
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" });
Si puede usar LINQ, puede hacer 'keya.SequenceEqual (keyb)'. – Ani
Desafortunadamente eso no está disponible en mono. – Ali
¿No es este un duplicado de [Comparar dos objetos de matriz .Net (matrices de bytes)] (http://stackoverflow.com/q/486749/15639)? – MarkJ