Ответ 1
Вы можете отсортировать список на месте, просто позвонив List<T>.Sort
:
list.Sort();
Это будет использовать естественный порядок элементов, что прекрасно в вашем случае.
EDIT: обратите внимание, что в вашем коде вам понадобится
_details.Sort();
поскольку метод Sort
определяется только в List<T>
, а не IList<T>
. Если вам нужно сортировать его снаружи, где у вас нет доступа к нему как List<T>
(вы не должны использовать его, так как часть List<T>
- это деталь реализации), вам нужно сделать немного больше работа.
Я не знаю никаких IList<T>
-локальных видов на месте в .NET, что сейчас немного странно, я думаю об этом. IList<T>
предоставляет все, что вам нужно, поэтому его можно записать как метод расширения. Существует множество реализаций быстрой сортировки, если вы хотите использовать один из них.
Если вам не нужна небольшая неэффективность, вы всегда можете использовать:
public void Sort<T>(IList<T> list)
{
List<T> tmp = new List<T>(list);
tmp.Sort();
for (int i = 0; i < tmp.Count; i++)
{
list[i] = tmp[i];
}
}
Другими словами, скопируйте, выполните сортировку на месте, затем скопируйте отсортированный список назад.
Вы можете использовать LINQ для создания нового списка, который содержит исходные значения, но отсортированные:
var sortedList = list.OrderBy(x => x).ToList();
Это зависит от того, какое поведение вы хотите. Обратите внимание, что ваш метод тасования не идеален:
- Создание нового метода
Random
в рамках метода запускается в некоторые из проблем показанных здесь - Вы можете объявить
val
внутри цикла - вы не используете это значение по умолчанию - Более идиоматично использовать свойство
Count
, когда вы знаете, что работаете сIList<T>
- На мой взгляд, цикл
for
проще понять, чем перемещение списка назад с помощью циклаwhile
Существуют другие реализации перетасовки с Fisher-Yates on Qaru - поиск, и вы найдете его довольно быстро.