Jim*_*mmy 1 c# sorting bindinglist
有一个如何修改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));
}
}
Run Code Online (Sandbox Code Playgroud)
然后在新版本中SortableBindingList更改此行:
itemsList.Sort(comparer);
Run Code Online (Sandbox Code Playgroud)
至:
itemsList.StableSort(comparer);
Run Code Online (Sandbox Code Playgroud)
这通过在列表中的项索引上使用补充有辅助键的不稳定排序来工作.由于此版本不使用病态慢插入排序来实现稳定排序,因此它应该足够快以供一般使用.
| 归档时间: |
|
| 查看次数: |
2516 次 |
| 最近记录: |