Был задан вопрос о том, как отсортировать список. Было несколько методов, данных из базового List.Sort () в List.OrderBy (). Самым смехотворным был «Выбор по вашему выбору». Я быстро проголосовал за это, но это заставило меня задуматься; не будет ли Linq's OrderBy (), примененный к списку, делать то же самое? myList.OrderBy (x => x.Property) .ToList () создаст итератор, который в основном находит минимальное значение проекции в том, что осталось от коллекции, и yield возвращает его. При просмотре всего списка это сортировка выбора.
Что заставило меня задуматься; какие алгоритмы используют встроенные сортировщики для списков, сортированных списков, перечислимых объектов и т. д., и, как следствие, следует ли избегать их использования для больших коллекций? SortedList, поскольку он остается отсортированным по ключу, вероятно, будет использовать однопроходную InsertionSort для каждого добавления; найдите первый индекс со значением больше нового и вставьте перед ним. Списки и массивы, вероятно, сами по себе MergeSort работают довольно эффективно, но я не знаю фактического алгоритма Sort (). Мы обсудили OrderBy.
То, что я знаю выше, может показаться, что List.Sort () или Array.Sort () являются лучшими вариантами для списка известного размера, и использование Linq для сортировки списка или массива в памяти не рекомендуется. Для потока действительно нет другого способа, кроме OrderBy () перечислимого; потеря производительности снижается благодаря тому, что вы можете хранить данные в виде потока, вместо того чтобы иметь их все перед сортировкой.
EDIT:
Общий консенсус заключается в том, что Sort () быстрее при конкретной реализации List или Array. OrderBy разумно, но медленнее, потому что добавляет O (N) сложность извлечения массива из переданного перечислимого. Инициализация SortedList заканчивается O (N ^ 2) из-за того, что находится под капотом. Мораль истории, используйте List.Sort () вместо List.OrderBy (), когда у вас есть фактический список.