2013-11-26 27 views
0

我知道List<T>.SortEnumerable.OrderBy排序算法有区别。后者是稳定,这意味着元素是相等的,它保留了它们的原始顺序。列表<T> .Sort和OrderBy的结果有什么不同?

这一切都很好地重复了定义,但要教这个,我想演示一个简单的示例,其中结果的算法不同。

我发现来到了这个例子“鉴于从最早的七个兄弟姐妹韦斯莱到最小,按名称排序长度他们”。

var weasleys = new List<string>{"Bill", "Charlie", "Percy", "Fred", "George", "Ron", "Ginny"}; 

在这种情况下,排序依据

weasleys.OrderBy(x => x.Length) 

可以得到:罗恩,比尔,弗雷德,珀西,金妮,乔治,查理。请注意,'比尔'和'弗雷德'的长度相同,但比尔比较老,所以比尔最先。

而List.Sort

weasleys.Sort((x, y) => x.Length.CompareTo(y.Length)); 

可以得到:罗恩,弗雷德,比尔,金妮,珀西,乔治,查理。

我的例子有七个项目。有一个更简单的情况下有更少的项目? 算法给出不同结果的最小列表是什么?

+1

看看这个答案,HTTP://计算器。COM /问题/ 1832684/C锋利排序和排序依据对比 – ZaoTaoBao

+0

你的实施例具有设置的一条线,这两种情况下之间共享,并且对于每种情况一行。你可能希望多少少? –

+0

万一别人猜错了,请详细说明你到底没有在这个例子中明白了,你想怎么有“较少的项目”。我如不猜。 – quetzalcoatl

回答

0

我不知道,但也许: 排序仅仅是一个方法。 OrderBy是扩展方法(Linq) http://msdn.microsoft.com/en-us/library/vstudio/bb383982.aspx OrderBy是稍后制作的,适用于IEnumerable。它是linq的一部分,当你想把orderby和其他linq动作结合起来时,它给了你更多的功能。

+0

无论是扩展方法或构建方法是完全inrealed。唯一重要的是底层算法。 – Andrey

+0

我以为他问:为什么有2种方法做“相同”的工作。所以我认为第一种方法是由person1设计的,第二种方法是由person2为新系统设计的。你可以冷静下来,我不是专家。 – zgnilec

+0

我不低调竞争的答案。但事情是,我们只能猜测原因是什么,只有Eric Lippert跳进来才能知道,但这不太可能。所以从实际的角度来看,重要的是他们的行为是有据可查的。 – Andrey

3

排序算法的这种属性被称为stabilityList<T>.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

+0

算法给出不同结果的最小列表是什么? –

+0

@ColonelPanic你的列表无法在.net 4.5上使用(请参阅我对该问题的评论),所以我根本无法重现它。我真的不明白你的问题的重点,你为什么关心这个“最小的名单”。 – Andrey

相关问题