有一个如何修改SortableBindingList以使用稳定排序的示例。但是,有一个更新版本的 SortableBindingList。修改这个新版本以使用稳定排序的最佳方法是什么?我想我希望在 SortableBindingList 上有一个标志,让 SortableBindingList 的用户决定他们是要使用(较慢)稳定排序还是(较快)默认排序。
谢谢
有一个如何修改SortableBindingList以使用稳定排序的示例。但是,有一个更新版本的 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);
这是通过使用不稳定的排序并在列表中的项目索引上添加辅助键来实现的。由于这个版本没有使用病态缓慢的插入排序来实现稳定的排序,所以它应该足够快以供一般使用。