List.Sort(按长度)在不同的计算机上返回不同的结果

时间:2014-08-12 00:18:10

标签: c# sorting

我有以下代码:

List<string> Words = item.Split(' ').ToList<string>();
Words.Sort((a, b) => b.Length.CompareTo(a.Length));

应该根据文件(项目)的大小对文件(项目)中的单词列表进行排序。但是,如果两个单词具有相同的长度,则应该按行中的外观顺序对它们进行排序。

这里的问题是,如果该行是,例如“abc”,在我的计算机上,该列表将有三个已排序的项目(0 - a,1 - b,2 - c),但在另一台计算机上,使用相同的.Net版本(4.5),排序的项目将是(0 - c,1 - b,2 - a)

有没有办法在不同的计算机上强制执行相同的结果?

3 个答案:

答案 0 :(得分:10)

List.Sortunstable sort,在您的情况下,相同长度的元素可以按不同的顺序排列。

  

此实现执行不稳定的排序;也就是说,如果两个元素相等,则可能不会保留它们的顺序。相反,稳定的排序保留了相等元素的顺序。

答案 1 :(得分:7)

您可以使用LINQ和OrderBy / ThenBy次调用来强制执行相同的结果,而不是Sort

var result = source.Select((v, i) => new { v, i })
                   .OrderBy(x => x.v.Length)
                   .ThenBy(x => x.i)
                   .Select(x => x.v)
                   .ToList();

但是你应该知道,它会创建新的列表,而不是对现有的列表进行排序:

答案 2 :(得分:1)

方法List.Sort()是一种不稳定的排序。您无法预测重复键的顺序。

有两种通用方法可以解决此问题:使用稳定排序,或通过扩展密钥以包含身份信息来强制唯一性。

常见的稳定排序之一是插入排序。我相信这将是SortedList使用的排序,但它不允许重复键。如果做不到这一点,你可以用Linq或手工编写自己的。即使是冒泡也很稳定!

首选方法是保留商品标识。创建一个对列表,其中每对由键值及其在列表中的位置组成。对对列表进行排序,或将对直接插入到排序列表中,因为每对都是唯一的。这些对的排序及其包含的密钥在所有平台上都保证相同。