有人问如何对List进行排序,提供了几种方法,从基本的List.Sort()到List.OrderBy()。最可笑的是自己编写选择排序算法。我立即投票反对它,但这让我想到:不是Linq的OrderBy()应用于列表就可以做同样的事情吗?myList.OrderBy(x=>x.Property).ToList()将生成一个迭代器,在剩余的集合中找到投影的最小值并返回它。遍历整个列表时,这就是一种选择排序。
这让我想到:内置的排序器(Lists、SortedLists、Enumerables等)使用哪些算法,从而推断出是否应该避免使用其中的任何一种来处理大型集合?SortedList因为按键排序,可能会在每次添加时使用单趟插入排序;查找第一个值大于新值的索引,并在其前插入。Lists和Arrays可能会高效地MergeSort自己,但我不知道Sort()背后的实际算法。我们已经讨论过OrderBy。
以上内容表明,对于已知大小的列表,List.Sort()或Array.Sort()是最佳选项,不建议使用Linq对内存中的列表或数组进行排序。对于流,除了对可枚举对象进行OrderBy()排序外,没有其他方法;性能损失得到缓解,因为您可以将数据保留为流,而不必在排序之前全部获取数据。
编辑:
普遍的共识是:在具体实现List或Array时,Sort()更快。OrderBy是合理的,但速度较慢,因为它增加了从传递的可枚举对象中提取数组的O(N)复杂度。SortedList初始化最终变成了O(N^2),因为底层实现如此。故事的寓意是,在有实际列表时,请使用List.Sort()而不是List.OrderBy()。
这让我想到:内置的排序器(Lists、SortedLists、Enumerables等)使用哪些算法,从而推断出是否应该避免使用其中的任何一种来处理大型集合?SortedList因为按键排序,可能会在每次添加时使用单趟插入排序;查找第一个值大于新值的索引,并在其前插入。Lists和Arrays可能会高效地MergeSort自己,但我不知道Sort()背后的实际算法。我们已经讨论过OrderBy。
以上内容表明,对于已知大小的列表,List.Sort()或Array.Sort()是最佳选项,不建议使用Linq对内存中的列表或数组进行排序。对于流,除了对可枚举对象进行OrderBy()排序外,没有其他方法;性能损失得到缓解,因为您可以将数据保留为流,而不必在排序之前全部获取数据。
编辑:
普遍的共识是:在具体实现List或Array时,Sort()更快。OrderBy是合理的,但速度较慢,因为它增加了从传递的可枚举对象中提取数组的O(N)复杂度。SortedList初始化最终变成了O(N^2),因为底层实现如此。故事的寓意是,在有实际列表时,请使用List.Sort()而不是List.OrderBy()。