example如何修改SortableBindingList以使用稳定排序。但是,有一个updated version of SortableBindingList。修改此新版本以使用稳定排序的最佳方法是什么?我想我希望SortableBindingList上有一个标志让SortableBindingList的用户决定是否要使用(较慢)稳定排序或(更快)默认排序。
由于
答案 0 :(得分:5)
您可以通过为List<T>
编写稳定的排序扩展方法来解决此问题:
public static class ListExtensions
{
public static void StableSort<T>(this List<T> list, IComparer<T> comparer)
{
var pairs = list.Select((value, index) => Tuple.Create(value, index)).ToList();
pairs.Sort((x, y) =>
{
int result = comparer.Compare(x.Item1, y.Item1);
return result != 0 ? result : x.Item2 - y.Item2;
});
list.Clear();
list.AddRange(pairs.Select(key => key.Item1));
}
}
然后在新版SortableBindingList
中更改此行:
itemsList.Sort(comparer);
为:
itemsList.StableSort(comparer);
这是通过在列表中的项索引上使用补充了辅助键的不稳定排序来实现的。由于此版本不使用病态缓慢的插入排序来实现稳定排序,因此它应该足够快以供一般使用。