有一个example如何修改 SortableBindingList使用稳定排序。但是,有一个 updated version of SortableBindingList .修改此新版本以使用稳定排序的最佳方法是什么?我想我希望 SortableBindingList 上有一个标志,让 SortableBindingList 的用户决定他们是想使用(较慢的)稳定排序还是(较快的)默认排序。
谢谢
最佳答案
您可以通过为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);
这是通过在列表中的项目索引上使用辅以辅助键的不稳定排序来实现的。由于此版本不使用病态缓慢的插入排序来实现稳定排序,因此它应该足够快以供一般使用。
关于c# - 使 SortableBindingList 使用稳定排序的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7342319/