我了解List<T>.Sort
和Enumerable.OrderBy
中的排序算法之间存在差异。后者是稳定的,意思是元素相等,它保留了原始的顺序。
这一切都很好地重复了这个定义,但是要教这个,我想展示一个简单的示例,其中算法的结果不同。
我找到了这个例子“鉴于从最老到最年轻的七个韦斯莱兄弟姐妹,按姓名长度排序。”
var weasleys = new List<string>{"Bill", "Charlie", "Percy", "Fred", "George", "Ron", "Ginny"};
在这种情况下,OrderBy
weasleys.OrderBy(x => x.Length)
给[Ron,Bill,Fred,Percy,Ginny,George,Charlie]。请注意,“比尔”和“弗雷德”的长度相同,但比尔年龄较大,因此比尔是第一位的。
而List.Sort
weasleys.Sort((x, y) => x.Length.CompareTo(y.Length));
给[Ron, Fred ,Bill,Ginny,Percy,George,Charlie]。
我的例子有七个项目。是否有更简单的案例,项目更少? 算法给出不同结果的最小列表是什么?
答案 0 :(得分:3)
排序算法的这个属性称为stability。 List<T>.Sort
明确地不稳定:
此实现执行不稳定的排序;也就是说,如果是两个 元素是相等的,它们的顺序可能不会被保留。相比之下,a stable sort保留了相等元素的顺序。
http://msdn.microsoft.com/en-us/library/b0zbh7b6(v=vs.110).aspx
OrderBy
明确地稳定的地方:
此方法执行稳定排序;也就是说,如果两个键 元素相等,元素的顺序得以保留。在 相反,不稳定的排序不会保留元素的顺序 具有相同的密钥。
http://msdn.microsoft.com/en-us/library/bb534966(v=vs.110).aspx
答案 1 :(得分:0)
我不确定,但也许: 排序只是一种方法。 OrderBy是扩展方法(Linq) http://msdn.microsoft.com/en-us/library/vstudio/bb383982.aspx OrderBy稍后制作,并与IEnumerable一起使用。它是linq的一部分,当你想将orderby与其他linq动作结合使用时,它会为你提供更多功能。