Для сортировки на месте вы, по сути, увидите эти два подхода:
IList<T> list = .... // your ilist
var sorted = list.ToArray();
Array.Sort(sorted);
for (int i = 0; i < list.Count; i++)
{
list[i] = sorted[i];
}
и
IList<T> list = .... // your ilist
ArrayList.Adapter((IList)list).Sort();
Второй вариант может выглядеть проще, но он не подходит для коллекций типов значений, поскольку влечет за собой штрафы за бокс. Более того, нет гарантии, что ваш IList<T>
будет реализовывать IList
. Первый лучше ИМО.
Вы также можете использовать первый подход для сортировки ICollection<T>
на месте , но сомнительно, следует ли вам предоставлять такую функциональность, поскольку контракт ICollection<T>
не гарантирует порядок (подумайте о хэш-структурах). В любом случае, чтобы показать вам пример кода:
ICollection<T> collection = .... // your icollection
var sorted = collection.ToArray();
Array.Sort(sorted);
collection.Clear();
foreach (var i in sorted)
{
collection.Add(i);
}
Замечание о стабильности сортировки: алгоритмы сортировки массивов / списков .NET нестабильны. Для стабильной сортировки вам нужно будет использовать:
IList<T> list = .... // your ilist
var sorted = list.OrderBy(i => i).ToArray();
for (int i = 0; i < list.Count; i++)
{
list[i] = sorted[i];
}
Это не может быть так быстро, как нестабильные сорта.
Наконец, для полного ответа, возможно, лучше использовать комбинированный подход, принятый watbywbarif:
public static void Sort<T>(this IList<T> list, IComparer<T> comparer, bool stable)
{
if (stable)
{
list.StableSort(comparer);
}
else
{
list.UnstableSort(comparer);
}
}
static void StableSort<T>(this IList<T> list, IComparer<T> comparer)
{
list.OrderBy(x => x, comparer).CopyTo(list);
}
static void UnstableSort<T>(this IList<T> list, IComparer<T> comparer)
{
switch (list)
{
case List<T> l:
l.Sort(comparer);
break;
case T[] a:
Array.Sort(a, comparer);
break;
default:
T[] sortable = list.ToArray();
sortable.UnstableSort(comparer);
sortable.CopyTo(list);
break;
}
}
static void CopyTo<T>(this IEnumerable<T> source, IList<T> target)
{
int i = 0;
foreach (T item in source)
{
target[i++] = item;
}
}
Это все, что касается встроенных подходов. Для более быстрой реализации вам придется развернуть свой собственный, см. https://stackoverflow.com/a/19167475
person
nawfal
schedule
09.08.2020
myobj
всегдаList
? Если это так, вы можете преобразовать его вList
и запустить егоSort
функцию. - person Gabe   schedule 02.10.2010