C#-按选定的列对矩形数组进行排序

时间:2018-08-11 22:14:33

标签: c# sorting multidimensional-array

请如何按第二列desc,然后按第一列asc(然后将结果等级插入第三列,我想可能是一个单独的问题)对以下数组(在C#中)进行排序。 我是C#的初学者,我花了很多时间寻找这个看似简单的问题的答案,但是我找不到适合我的任何方法。谢谢您的任何帮助。

int[,] myArray = new int[5, 4]
{
   {1, 7, 0, 0} ,
   {2, 12, 0, 0} ,
   {3, 15, 0, 0} ,
   {4, 7, 0, 0} ,
   {5, 1, 0, 0}
};

1 个答案:

答案 0 :(得分:4)

在多维数组中,实际上没有“行”的概念。所有值彼此之间都具有相同的关系。这就是为什么对多维数组进行排序有些棘手的原因。

使用jagged arrays(基本上是数组数组)会变得更加容易。您的数组如下所示:

int[][] myJaggedArray = new int[][]
{
   new int[] { 1, 7, 0, 0 },
   new int[] { 2, 12, 0, 0 },
   new int[] { 3, 15, 0, 0 },
   new int[] { 4, 7, 0, 0 },
   new int[] { 5, 1, 0, 0 },
};

您还可以将多维数组转换为锯齿状数组,如下所示:

int[][] myJaggedArray = new int[myArray.GetUpperBound(0) + 1][];
for(int i = 0; i < myJaggedArray.Length; i++)
    myJaggedArray[i] = Enumerable.Range(0, myArray.GetUpperBound(1) + 1).Select(k => myArray[i,k]).ToArray();

一旦有了锯齿状的数组,使用LINQ进行排序就很容易了

var result = myJaggedArray
    .OrderBy(row => row[1])
    .ThenBy(row => row[0])
    .Select((row, idx) =>
    {
        row[2] = idx;
        return row;
    })
    .ToArray();