C#: Как я могу сортировать строки в 2D-массиве в порядке возрастания на основе наибольшего значения в одном столбце?

#c# #arrays #sorting #multidimensional-array

Вопрос:

Итак, у меня есть таблица данных в 2D-массиве (первый столбец-порядковый номер строк, а остальные-данные, с которыми я работаю). Мой вопрос в основном заключается в том, как я могу сортировать строки на основе наибольшего значения в последнем столбце (т. Е. Если четвертая строка получила наибольшее значение в последнем столбце, она переходит в первую строку и так далее). random в коде есть только метод, который я создал для генерации чисел с плавающей запятой между x и y.

Мой код до сих пор выглядит так:

 static float random(float min, float max)
        {
            System.Random random = new System.Random();
            double val = (random.NextDouble() * (max - min)   min);
            return (float)val;
        }
static void Main(string[] args)
        {

            int temp = 0, i, j;
            float[,] matrix;
            matrix = new float[10, 5];
            
            //generating ordinal number
            for (i = 0; i < 10; i  )
            {
                matrix[i, 0] =   temp;
            }
            //generating rest of the 2D array
            for (i = 0; i < 10; i  )
            {
                for (j = 0; j < 5; j  )
                {
                    matrix[i, 1] = random(60, 100);
                    matrix[i, 2] = random(50, 100);
                    matrix[i, 3] = random(40, 100);
                    matrix[i, 4] = (matrix[i, 1]   matrix[i, 2]   matrix[i, 3]) / 3;
                }
            }
            
            for (i = 0; i < 10; i  )
            {
                for (j = 0; j < 5; j  )
                {
                    Console.Write(matrix[i, j]   "t");
                }
                Console.WriteLine();
            }
            Console.WriteLine();

        }
 

Ответ №1:

Я предлагаю использовать неровный массив (массив массива) float[][] вместо 2d float[,] . С помощью неровного массива вы можете сортировать в одной простой строке:

     using System.Linq;

    ...

    float[][] matrix = ...

    // Column to compare
    int column = 4; // or matrix[0].Length - 1; for the last olumn

    Array.Sort(matrix, (left, right) => left[column].CompareTo(right[column]))); 
 

Если вы настаиваете на том float[,] , чтобы вы могли скопировать его в неровный массив, отсортировать, а затем скопировать обратно:

     float[,] matrix = ...

    int column = 4;

    float[][] temp = Enumerable
      .Range(0, matrix.GetLength(0))
      .Select(i => Enumerable
         .Range(0, matrix.GetLength(1))
         .Select(j => matrix[i, j])
         .ToArray())
      .ToArray(); 

    Array.Sort(temp, (left, right) => left[column].CompareTo(right[column])); 

    for (int i = 0; i < temp.Length;   i)
      for (int j = 0; j < temp[i].Length;   j)
        matrix[i, j] = temp[i][j];