要就地排序,您基本上会看到这两种方法:
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
。第一个是更好的IMO。
您也可以使用第一种方法对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 的 Array/List 排序算法是不稳定的。对于稳定的排序,您将不得不使用:
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