如何在不扁平化的前提下对C#二维数组按列排序?
对C#多维数组按行字典序排序(无需扁平化)
针对你给出的int[,]多维数组,要实现按行的字典序排序(先比首列元素,首列相同则依次比较后续列元素),可以按以下步骤实现:
实现思路
- 将多维数组转换为交错数组(
int[][]),方便单独处理每一行 - 自定义字典序比较逻辑,对行进行排序
- 将排序后的交错数组转换回原格式的多维数组
代码实现
方法一:自定义比较器通用方案(适配动态列数)
int[,] numbers = new int[4,3] { { -1,3,5 }, {5,6,8 },{-1,0,2},{2,3,5} }; // 1. 提取所有行到交错数组 int rowCount = numbers.GetLength(0); int colCount = numbers.GetLength(1); int[][] rows = new int[rowCount][]; for (int i = 0; i < rowCount; i++) { rows[i] = new int[colCount]; for (int j = 0; j < colCount; j++) { rows[i][j] = numbers[i, j]; } } // 2. 按字典序排序:依次比较每一列元素 Array.Sort(rows, (a, b) => { for (int i = 0; i < colCount; i++) { int compareResult = a[i].CompareTo(b[i]); if (compareResult != 0) return compareResult; } return 0; }); // 3. 转换回多维数组 int[,] sortedNumbers = new int[rowCount, colCount]; for (int i = 0; i < rowCount; i++) { for (int j = 0; j < colCount; j++) { sortedNumbers[i, j] = rows[i][j]; } } // 打印验证结果 for (int i = 0; i < rowCount; i++) { Console.WriteLine($"{{{string.Join(", ", rows[i])}}}"); } // 输出结果: // {-1, 0, 2} // {-1, 3, 5} // {2, 3, 5} // {5, 6, 8}
方法二:LINQ简化方案(列数固定时使用)
如果数组列数固定,可以用OrderBy+ThenBy链式调用简化排序逻辑:
int[,] numbers = new int[4,3] { { -1,3,5 }, {5,6,8 },{-1,0,2},{2,3,5} }; int rowCount = numbers.GetLength(0); int colCount = numbers.GetLength(1); // 提取行并排序 var sortedRows = Enumerable.Range(0, rowCount) .Select(i => Enumerable.Range(0, colCount).Select(j => numbers[i, j]).ToArray()) .OrderBy(row => row[0]) .ThenBy(row => row[1]) .ThenBy(row => row[2]) .ToArray(); // 转换回多维数组 int[,] sortedNumbers = new int[rowCount, colCount]; for (int i = 0; i < rowCount; i++) { for (int j = 0; j < colCount; j++) { sortedNumbers[i, j] = sortedRows[i][j]; } }
注意事项
- 若数组列数不固定,优先使用自定义比较器方案,避免硬编码多个
ThenBy - 上述代码均生成新的排序数组,不会修改原多维数组
- 如果你本身使用的是交错数组(
int[][]),可直接跳过数组格式转换步骤,直接排序
内容的提问来源于stack exchange,提问作者user3921104
相关产品推荐
相关产品推荐

