Can Tôi kiểm tra - bạn có nghĩa là một mảng hình chữ nhật ([,]
) hoặc một mảng răng cưa ([][]
)?
Việc sắp xếp một mảng có răng cưa khá dễ dàng; Tôi có một cuộc thảo luận về điều đó here. Rõ ràng trong trường hợp này, Comparison<T>
sẽ liên quan đến một cột thay vì sắp xếp theo thứ tự - nhưng rất giống nhau.
Sắp xếp một mảng hình chữ nhật là phức tạp hơn ... Tôi có thể bị cám dỗ sao chép dữ liệu vào một mảng hình chữ nhật hoặc List<T[]>
và sắp xếp tại đó, sau đó sao chép lại.
Dưới đây là một ví dụ sử dụng một mảng lởm chởm:
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]));
}
Để làm việc với một mảng hình chữ nhật ... tốt, đây là một số mã để trao đổi giữa hai một cách nhanh chóng ...
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];
}
}
}
Điều đó nghe có vẻ thú vị, bạn có thể đăng hoặc liên kết đến một số ví dụ mã hay không. – Jack
Xong. Nó có thể có một lỗi ở đâu đó - tôi đã viết nó trong notepad. – MusiGenesis
Ngạc nhiên bạn đã viết rằng trong notepad - ở mức nào, nó hoạt động rất tốt. Cảm ơn bạn. – Jack