Вы можете отсортировать список на месте , просто позвонив по телефону List<T>.Sort
:
list.Sort();
Это будет использовать естественное упорядочение элементов, что хорошо в вашем случае.
РЕДАКТИРОВАТЬ: обратите внимание, что в вашем коде вам потребуется
_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
Существуют и другие реализации тасования с Фишером-Йейтсом при переполнении стека - ищите, и вы найдете его довольно быстро.