Witam,
skoro mamy porównywać tablice czy są równe(czy zawierają te same elementy) to może wyliczymy
hashCode dla dwóch tablic i porównamy je. Pomyślałem sobie że można by napisać swoją klasę tablic,
która umożliwiałaby szybkie porównanie.
Zaimplementowałem sobie rozszerzenie tablicy:
public class ArrayExtension<T> where T : class
{
private T[] mTable;
private int mHashCode;
public ArrayExtension(int lenght)
{
if (lenght <= 0)
throw new ArgumentException("Dlugosc nie moze byc mniejsza rowna zero !");
this.mTable = new T[lenght];
}
public T this[int index]
{
get
{
if (index >= 0 && index < this.mTable.Length)
return this.mTable[index];
else
throw new IndexOutOfRangeException("Indeks wykracza poza rozmiar tablicy !");
}
set
{
if (index >= 0 && index < this.mTable.Length)
{
this.mHashCode += value.GetHashCode();
this.mTable[index] = value;
}
else
throw new IndexOutOfRangeException("Indeks wykracza poza rozmiar tablicy !");
}
}
public override int GetHashCode()
{
return this.mHashCode;
}
}
Przy dodawaniu elementów obliczany jest hashCode, jeśli tablice mają te same elementy to
porównanie czy obie są równe sprowadza się do porównania hashCode.
Oczywiście zakładamy że każdy typ obiektu ma dobrze zaimplementowaną metodę GetHashCode()
Przykład dla klasy String:
int lenght = 2;
ArrayExtension<string> array1 = new ArrayExtension<string>(lenght);
ArrayExtension<string> array2 = new ArrayExtension<string>(lenght);
array1[0] = "Wilk";
array1[1] = "Mysz";
array2[0] = "Mysz";
array2[1] = "Wilk";
Console.WriteLine(String.Format("Tablice sa rowne: {0}", array1.GetHashCode() == array2.GetHashCode() ? "TAK" : "NIE"));
array1[0] = "Wilk";
array1[1] = "Mysz";
array2[0] = "Wilk";
array2[1] = "Masz";
Console.WriteLine(String.Format("Tablice sa rowne: {0}", array1.GetHashCode() == array2.GetHashCode() ? "TAK" : "NIE"));
wynik porównania:
Tablice sa rowne: TAK
Tablice sa rowne: NIE
Nie jest to może najefektywniejszy sposób, ale co tam ;) Zawsze jakiś pomysł ;)
Pozdrawiam