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

标签 c# sorting bindinglist

有一个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/

相关文章:

java - 尝试对 Java 对象数组进行排序

datagridview - BindingList<T> 在何处/何时/如何将 PropertyChanged 转换/连接到 ListChanged 事件

c# - C# 中的 cXML PunchOutSetupRequest 和 PunchOutSetupResponse 示例

c# - 任务计划程序中的 Oracle 错误

c - 对于较大尺寸的字符串,不会发生插入

string - 没有 EOF 字符的 Burrows-Wheeler 变换

c# - 在 BindingList 的 ItemChanging 事件中获取 Deleted Item

c# - 什么是不断变化的表格表示的最佳集合类型

c# - 将 ASP.NET 生成的 pdf byte[] 显示到网页而不保存文件