Как применить Array.Sort для Collection <T>? - PullRequest
1 голос
/ 10 июня 2019

У меня есть коллекция (в ней собраны большие> 100К пользовательских сложных элементов, и добавление новых элементов происходит очень часто). Мне нужно отсортировать это только один раз - прежде чем показать это. Чтобы упростить мой вопрос, скажем, что у меня есть коллекция целых чисел, которые мне нужно отсортировать:

private static void Main(string[] args)
{
    var collection = new Collection<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    var array = new [] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

    // How to apply Array.Sort to Collection<T> ?
    list.Sort();       //ok
    Array.Sort(array); //ok
}

В основном list.Sort(); использует Array.Sort<T>(this._items, index, count, comparer);

Как мне отсортировать мои Collection<T>? (без копирования)

1 Ответ

9 голосов
/ 10 июня 2019

Нет удобного способа сделать это;Collection<T> не предоставляет необработанный доступ к внутреннему буферу, даже для подклассов (protected).Без этого вы не сможете выполнить чистую сортировку на месте.

Вы можете вручную выполнить сортировку для базового .Items (protected), но это большая работа и будет неэффективной.

Что вы могли бы также сделать:

  • арендовать массив из пула массивов
  • скопировать данные из локальной коллекции варендованный массив
  • сортирует этот массив
  • , либо очищает и заново добавляет все из отсортированного в настоящее время массива, либо перезаписывает элементы индекса по индексу из теперь отсортированного массива
  • возврат арендованного массива в пул массивов

Однако лично я, вероятно, скажу "если вам нужно отсортировать, используйте List<T>" - это сэкономит вам многоработа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...