我有以下代码:
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)
有没有办法在不同的计算机上强制执行相同的结果?
答案 0 :(得分:10)
List.Sort
是unstable 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或手工编写自己的。即使是冒泡也很稳定!
首选方法是保留商品标识。创建一个对列表,其中每对由键值及其在列表中的位置组成。对对列表进行排序,或将对直接插入到排序列表中,因为每对都是唯一的。这些对的排序及其包含的密钥在所有平台上都保证相同。