【问题标题】:What's the smallest list on which List<T>.Sort and OrderBy differ in result?List<T>.Sort 和 OrderBy 结果不同的最小列表是什么?
【发布时间】:2013-11-26 21:37:01
【问题描述】:

我了解List&lt;T&gt;.SortEnumerable.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

标签: c# .net sorting


【解决方案1】:

排序算法的这个属性称为stabilityList&lt;T&gt;.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

【讨论】:

  • 算法给出不同结果的最小列表是什么?
  • @ColonelPanic 您的列表不适用于 .net 4.5(请参阅我对问题的评论),因此我根本无法复制它。我真的不明白你的问题的重点,你为什么关心这个“最小的列表”。
【解决方案2】:

我不确定,但也许: 排序只是一种方法。 OrderBy 是扩展方法(Linq) http://msdn.microsoft.com/en-us/library/vstudio/bb383982.aspx OrderBy 是后来制作的,可与 IEnumerable 一起使用。它是 linq 的一部分,当您想将 orderby 与其他 linq 操作相结合时,它为您提供了更多功能。

【讨论】:

  • 无论是扩展方法还是内置方法,都是完全不真实的。唯一重要的是底层算法。
  • 我以为他会问为什么有两种方法在做“相同”的工作。所以我认为第一种方法是由 person1 设计的,第二种方法是由 person2 为新系统设计的。你当然可以投反对票,我不是专家。
  • 我不会反对竞争性答案。但问题是我们只能猜测原因是什么,只有 Eric Lippert 介入才能知道,但可能性很小。所以从实际的角度来看,重要的是他们的行为有据可查。
猜你喜欢
  • 2010-11-07
  • 2015-07-30
  • 2011-03-04
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多