Ciao
Non c'è una funzione già pronta per ordinare gli array rettangolari, però non è molto difficile implementarne una.
In questo esempio, ho creato una classe RectangleArraySorter la quale implementa l'interfaccia IComparer. Questa classe ha il compito di comparare gli elementi di un array rettangolare, ordinando però non gli elementi stessi, ma un array contenente gli indici (inizialmente 0,1,2,3,4...) degli elementi. In seguito all'ordinamento questo array contiene gli indici come sono in ordine (per esempio, 2,4,1,0,3...) ed è possibile ricostruire l'array ordinato.
Ecco l'esempio di codice:
private class RectangleArraySorter<T> : IComparer
where T : IComparable
{
private object[,] _array;
private int sortCol;
private RectangleArraySorter(object[,] theArray, int column)
{
if (theArray == null)
throw new ArgumentNullException("theArray");
if (theArray.Rank != 2)
throw new ArgumentException("Deve essere un array bidimensionale");
if (column < 0 || column >= theArray.GetLength(1))
throw new ArgumentOutOfRangeException("column");
this._array = theArray;
this.sortCol = column;
}
public static void Sort(object[,] array, int column)
{
// Costruisce il Sorter che ordinerà gli elementi
RectangleArraySorter<T> sorter = new RectangleArraySorter<T>(array, column);
// Costruisce l'array che contiene gli indici degli elementi.
// È in realtà questo array che viene ordinato.
int h = array.GetLength(0);
int[] indexes = new int[h];
for (int i = 0; i < h; i++)
indexes[i] = i;
// Ordina l'array degli indici
Array.Sort(indexes, sorter);
// Costruisce il nuovo array, ordinando secondo gli indici
int w = array.GetLength(1);
object[,] res = new object[h, w];
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
// Copia il valore nel nuovo array
res[i, j] = array[indexes[i], j];
}
}
// Copia dall'array temporaneo nell'array di partenza
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
array[i, j] = res[i, j];
}
}
}
#region IComparer Membri di
int IComparer.Compare(object x, object y)
{
// x e y sono l'indice delle righe da ordinare
int i1 = (int)x;
int i2 = (int)y;
// Confronta gli oggetti in posizione data
return ((T)_array[i1, sortCol]).CompareTo(_array[i2, sortCol]);
}
#endregion
}
Ed ecco come usarlo:
object[,] arr = new object[,] { { "uno", 1 }, { "cinque", 5 }, { "due", 2 } };
// Devi specificare l'indice della colonna che fa da ordinamento: 0
// E il tipo di dati in quella colonna: string
RectangleArraySorter<string>.Sort(arr, 0);
//// Se avessi voluto ordinare in base al numero, avresti fatto:
// RectangleArraySorter<int>.Sort(arr, 1);
Luca