使用Linq的列表顺序与sort不同

Nap*_*Nap 3 c# linq sorting list

我想证实这一点,我试图使用Linq对我的班级列表进行排序.但是当我使用sort函数时,似乎数据的顺序并没有以相同的方式排序.

假设列表包含4个ComputeItem,并且它们的所有A都设置为1,则所有B,C,D都设置为零.

情况1:

ItemList =
    ItemList
        .OrderByDescending(m => m.A)
        .ThenBy(m => m.B)
        .ThenBy(m => m.C)
        .ThenBy(m => m.D)
        .ToList<ComputeItem>();
Run Code Online (Sandbox Code Playgroud)

案例2:

ItemList.Sort(
    delegate(ComputeItem item1, ComputeItem item2)
    {
        if (item1.A == item2.A)
        {
            if (item1.B == item2.B)
            {
                if (item1.C == item2.C)
                {
                    return item1.D - item2.D;
                }
                else
                {
                    return item1.C - item2.C;
                }
            }
            else
            {
                return item1.B - item2.B;
            }
        }
        else
        {
            return item2.A - item1.A;
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

第一种结果是它没有移动任何东西.
第二种排序的结果是将其排序为不同的顺序.
Orignial Order [1,2,3,4]
CASE 1新订单[1,2,3,4]
CASE 2新订单[ 3,4,1,2 ]

现在问题出在我使用CASE2并尝试将其迁移到CASE 1之前.但是行为不能比之前大幅改变.知道为什么CASE 2移动了订单吗?

Dan*_*Tao 11

通过所使用的排序算法OrderBy,OrderByDescending,ThenBy,和ThenByDescending是一个稳定的 快速排序.从MSDN文档:

该方法执行稳定的排序; 也就是说,如果两个元素的键相等,则保留元素的顺序.

List<T>.Sort使用不稳定版本的QuickSort,它不一定保留相等元素的原始排序.再次,从MSDN文档:

此方法使用Array.Sort,它使用QuickSort算法.此实现执行不稳定的排序; 也就是说,如果两个元素相等,则可能不会保留它们的顺序.

这解释了您所看到的差异.显然,两者的最终结果是项目按照比较机制的方式排序.它只是出现未指定的相等元素的顺序List<T>.Sort.

好消息是你一个不稳定的排序变成一个稳定的排序.我很难想象这对你来说可能是一个突破性的变化(什么样的软件需要一种不稳定的?).如果有什么它应该使您的程序更可预测.