Есть ли поддержка C # для сортировки по индексу? - PullRequest
7 голосов
/ 18 марта 2009

Есть ли встроенная поддержка C # для сортировки по индексу?

Подробнее:
У меня есть несколько наборов данных, хранящихся в отдельных общих списках двойных. Это списки, всегда равные по длине и содержащие соответствующие элементы данных, но эти списки приходят и уходят динамически, поэтому я не могу просто хранить соответствующие элементы данных в классе или структуре чисто. (Я также имею дело с некоторыми унаследованными проблемами.)

Мне нужно иметь возможность сортировать эти ключи по любому из наборов данных.

Я подумал, что лучший способ сделать это - добавить один уровень косвенности и использовать сортировку по индексу. Такие сорта использовались годами.

Быстрое определение сортировки на основе индекса :
Создайте «index», массив последовательных целых чисел той же длины, что и списки, затем алгоритм сортировки сортирует список целых чисел так, что anylist[index[N]] дает N-й элемент любого списка в отсортированном порядке. Сами списки никогда не переупорядочиваются.

Есть ли встроенная поддержка C # для сортировки по индексу? Я не смог его найти ... все, что я нашел, переупорядочивает саму коллекцию. Я думаю, что поддержка существует, но я еще не посмотрел в нужном месте.

Я использую C # .NET 3.5 под Windows.

Ответы [ 2 ]

13 голосов
/ 18 марта 2009

После того как вы настроили индексный массив, вы можете отсортировать его, используя пользовательский Comparison<T>, который сравнивает значения в соответствующих элементах массива данных:

Array.Sort<int>(index, (a,b) => anylist[a].CompareTo(anylist[b]));
0 голосов
/ 18 марта 2009

Следующий код выполняет индексированную сортировку. Обратите внимание на вызов ToArray () для клонирования массива данных. Если опущен, массив данных также сортируется.

static void Main(String[] args)
{
   Int32[] data = new Int32[] { -6, 6, 5, 4, 1, 2, 3, 0, -1, -2, -3, -4, -5 };

   Int32[] indices = Enumerable.Range(0, data.Length).ToArray();

   Array.Sort(data.ToArray(), indices);

   foreach (Int32 index in indices)
   {
       Console.Write(String.Format("{0} ", data[index]));
   }

   Console.ReadLine();
}

Результат соответствует ожидаемому.

-6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...