【发布时间】:2013-11-26 21:37:01
【问题描述】:
我了解List<T>.Sort 和Enumerable.OrderBy 中的排序算法有所不同。后者是stable,意思是元素相等的地方,它保持原来的顺序。
重复定义非常好,但为了教授这一点,我想演示一个简单的算法结果不同的示例。
我发现想出了这个例子“给韦斯莱的七个兄弟姐妹,从大到小,按名字长度排序”。
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]。请注意,“Bill”和“Fred”的长度相同,但 Bill 年龄较大,所以 Bill 排在第一位。
而 List.Sort
weasleys.Sort((x, y) => x.Length.CompareTo(y.Length));
给 [Ron, Fred, Bill, Ginny, Percy, George, Charlie]。
我的示例有七个项目。有没有更简单的项目更少的情况? 算法给出不同结果的最小列表是什么?
【问题讨论】:
-
您的示例有一行设置,在两种情况下共享,每种情况下一行。你还能希望少多少?
-
如果其他人猜错了,请详细说明您在此示例中到底有哪些不明白的地方,以及您希望它如何“减少项目”..例如我猜不出来。
-
对不起,我真的老了... Sort 对当前列表进行排序,而 OrderBy 返回一个新列表,并且 sort() 执行不稳定排序,而 orderBy 执行稳定排序,如果键2个元素相等,保持元素顺序!
-
实际上它在 .net 4.5 上返回相同的序列:dotnetfiddle.net/yTQvBl