使SortableBindingList使用稳定排序的最简单方法

Jim*_*mmy 1 c# sorting bindinglist

有一个如何修改SortableBindingList以使用稳定排序的示例.但是,有一个SortableBindingList的更新版本.修改此新版本以使用稳定排序的最佳方法是什么?我想我希望SortableBindingList上有一个标志让SortableBindingList的用户决定是否要使用(较慢)稳定排序或(更快)默认排序.

谢谢

Ric*_*key 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));
    }
}
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)

这通过在列表中的项索引上使用补充有辅助键的不稳定排序来工作.由于此版本不使用病态慢插入排序来实现稳定排序,因此它应该足够快以供一般使用.