Puede Compruebo: ¿te refieres a una matriz rectangular ([,]
) o una matriz dentada ([][]
)?
Es bastante fácil ordenar una matriz dentada; Tengo una discusión sobre eso here. Obviamente, en este caso, el Comparison<T>
implicaría una columna en lugar de ordenar por ordinal, pero muy similar.
Ordenar una matriz rectangular es más complicado ... probablemente estaría tentado a copiar los datos a cabo ya sea en una matriz rectangular o una List<T[]>
, y ordenar a allí, a continuación, copiar de nuevo.
He aquí un ejemplo utilizando una matriz escalonada:
static void Main()
{ // could just as easily be string...
int[][] data = new int[][] {
new int[] {1,2,3},
new int[] {2,3,4},
new int[] {2,4,1}
};
Sort<int>(data, 2);
}
private static void Sort<T>(T[][] data, int col)
{
Comparer<T> comparer = Comparer<T>.Default;
Array.Sort<T[]>(data, (x,y) => comparer.Compare(x[col],y[col]));
}
Para trabajar con una matriz rectangular ... bueno, he aquí algo de código para cambiar entre los dos sobre la marcha ...
static T[][] ToJagged<T>(this T[,] array) {
int height = array.GetLength(0), width = array.GetLength(1);
T[][] jagged = new T[height][];
for (int i = 0; i < height; i++)
{
T[] row = new T[width];
for (int j = 0; j < width; j++)
{
row[j] = array[i, j];
}
jagged[i] = row;
}
return jagged;
}
static T[,] ToRectangular<T>(this T[][] array)
{
int height = array.Length, width = array[0].Length;
T[,] rect = new T[height, width];
for (int i = 0; i < height; i++)
{
T[] row = array[i];
for (int j = 0; j < width; j++)
{
rect[i, j] = row[j];
}
}
return rect;
}
// fill an existing rectangular array from a jagged array
static void WriteRows<T>(this T[,] array, params T[][] rows)
{
for (int i = 0; i < rows.Length; i++)
{
T[] row = rows[i];
for (int j = 0; j < row.Length; j++)
{
array[i, j] = row[j];
}
}
}
Eso suena interesante, puede publicar o enlazar algunos ejemplos de código, por favor. – Jack
Hecho. Puede tener un error en alguna parte, lo escribí en el bloc de notas. – MusiGenesis
Sorprendido, usted escribió eso en el bloc de notas, en cualquier caso, funcionó muy bien. Gracias. – Jack