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

发布于 2024-12-03 14:53:04 字数 540 浏览 0 评论 0原文

There is an example of how to modify SortableBindingList to use a stable sort. However, there is an updated version of SortableBindingList. What is the best way to modify this new version to use a stable sort? I think I would want a flag on the SortableBindingList to let the user of the SortableBindingList decide if they want to use (slower) stable sort or (faster) default sort.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

谁许谁一生繁华 2024-12-10 14:53:04

您可以通过为 List 编写稳定的排序扩展方法来解决此问题:

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);

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

You can solve this problem by writing a stable sort extension method for 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));
    }
}

and then in the new version of SortableBindingList change this line:

itemsList.Sort(comparer);

to:

itemsList.StableSort(comparer);

This works by using the unstable sort supplemented with a secondary key on the item index within the list. Since this version doesn't use the pathologically slow insertion sort to achieve a stable sort, it should be fast enough for general use.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文