none
Сортировка двумерного массива в C#

    Вопрос

  • Здравствуйте!

    Имеется двумерный массив:

    public dynamic[,] matrix = new dynamic[x, y];
    x и y могут быть любыми. Требуется отсортировать данный массив по нескольким столбцам, причём данные во всех остальных столбцах также будут изменяться в соответствии с изменением порядка данных в сортируемых столбцах. Т.е. нужно создать полный аналог сортировки таблицы в Excel. Существуют ли готовые методы для решения данной задачи? Или же придётся писать собственный велосипед?
    26 ноября 2018 г. 12:15

Ответы

  • Поясните, вам надо сортировать строки в массиве по нескольким столбцам в качестве критерия сортировки?

    Если так, то это самая обычная сортировка 1-мерного массива строк. Пишете функцию для сравнения данных по нужным столбцам и сортируйте как обычно. Функция будет выглядеть примерно так:

    int compare (object[] a, object[] b) 
    {
     if (a[x] != b[x])
     {
      return a[x] > b[x] ? 1 : -1;
     } 
     else if (a[y] != b[y]) 
     {
      return a[y] > b[y] ? 1 : -1;
     } 
     else if (...)
     { 
      // И так далее...
     }
     
     return 0;
    }

    a, b - строки подлежащие сравнению.

    x, y, z... - столбцы сортировки в порядке приоритета

    Чтоб можно было использовать стандартный Array.Sort() и для ускорения работы можно преобразовать двухмерный массив в массив массивов:

    (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/arrays/jagged-arrays)

    Иначе придется писать собственный метод сортировки который будет уметь переставлять строки в двухмерном массиве. Это, конечно, будет не быстро.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Помечено в качестве ответа Demid_T 27 ноября 2018 г. 8:34
    26 ноября 2018 г. 18:18
    Модератор

Все ответы

  • Здравствуйте,

    Можете рассмотреть решения, предложенные здесь:


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    26 ноября 2018 г. 13:13
    Модератор
  • К сожалению, здесь предлагаются решения, сортирующие массив по одному столбцу. Мне же нужно сортировать массив по нескольким столбцам (по 5-и, если быть точным).
    26 ноября 2018 г. 13:32
  • Поясните, вам надо сортировать строки в массиве по нескольким столбцам в качестве критерия сортировки?

    Если так, то это самая обычная сортировка 1-мерного массива строк. Пишете функцию для сравнения данных по нужным столбцам и сортируйте как обычно. Функция будет выглядеть примерно так:

    int compare (object[] a, object[] b) 
    {
     if (a[x] != b[x])
     {
      return a[x] > b[x] ? 1 : -1;
     } 
     else if (a[y] != b[y]) 
     {
      return a[y] > b[y] ? 1 : -1;
     } 
     else if (...)
     { 
      // И так далее...
     }
     
     return 0;
    }

    a, b - строки подлежащие сравнению.

    x, y, z... - столбцы сортировки в порядке приоритета

    Чтоб можно было использовать стандартный Array.Sort() и для ускорения работы можно преобразовать двухмерный массив в массив массивов:

    (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/arrays/jagged-arrays)

    Иначе придется писать собственный метод сортировки который будет уметь переставлять строки в двухмерном массиве. Это, конечно, будет не быстро.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Помечено в качестве ответа Demid_T 27 ноября 2018 г. 8:34
    26 ноября 2018 г. 18:18
    Модератор
  • Да, Илья. Спасибо! Идея с массивом массивов, Array.Sort() и функцией сравнения отличная! На моём массиве данных (x > 30000, y > 100) в сравнении с самописной сортировкой выбором быстродействие возросло порядка на три.
    27 ноября 2018 г. 8:34