Non credo che ci sia qualcosa nel framework che darà l'uguaglianza dell'array nel modo desiderato. Tuttavia, non è troppo difficile scrivere la propria implementazione di IEqualityComparer<T>
per gli array. Per esempio (ma non testato compilati):
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;
}
}
(Si noti che questo presuppone che attualmente elementComparer
farà fronte con valori nulli sia GetHashCode
e Equals
L'interfaccia non garantisce che, ma i comparatori di uguaglianza predefinito effettivamente fanno. . gestirlo si potrebbe modificare il codice qui sopra per essere più robusto, naturalmente ... solo che non ho tempo adesso)
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" });
fonte
2011-01-04 21:04:32
Se è possibile utilizzare LINQ, è possibile eseguire 'keya.SequenceEqual (keyb)'. – Ani
Purtroppo non è disponibile in mono. – Ali
Non è un duplicato di [Confronta due oggetti .Net Array (matrici di byte)] (http://stackoverflow.com/q/486749/15639)? – MarkJ