Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ使用什么排序算法;OrderBy";?_Linq_Algorithm_Sorting_Quicksort - Fatal编程技术网

LINQ使用什么排序算法;OrderBy";?

LINQ使用什么排序算法;OrderBy";?,linq,algorithm,sorting,quicksort,Linq,Algorithm,Sorting,Quicksort,显然,LINQ的“OrderBy”最初被指定为不稳定,但在Orca时代,它被指定为稳定。并不是所有的文档都得到了相应的更新——考虑这些链接: 但是,如果LINQ的OrderBy现在是“稳定的”,那么这意味着它没有使用快速排序(这本身就是不稳定的),即使一些文档(例如Troy的书)说它是。所以我的问题是:如果不是快速排序,那么LINQ的orderBy使用的实际算法是什么?我的理解是,orderBy被翻译成SQL,在数据库上执行排序。至少在LINQ to SQL的情况下,open to Sy

显然,LINQ的“OrderBy”最初被指定为不稳定,但在Orca时代,它被指定为稳定。并不是所有的文档都得到了相应的更新——考虑这些链接:


但是,如果LINQ的OrderBy现在是“稳定的”,那么这意味着它没有使用快速排序(这本身就是不稳定的),即使一些文档(例如Troy的书)说它是。所以我的问题是:如果不是快速排序,那么LINQ的orderBy使用的实际算法是什么?

我的理解是,
orderBy
被翻译成SQL,在数据库上执行排序。至少在LINQ to SQL的情况下,open to System.LINQ.EnumerableSorter显示Linq2Objects对LINQ to对象使用快速排序,这是一种稳定的快速排序。对于任何其他类型的LINQ,都将其留给底层实现。

使用了快速排序,但它之所以稳定,是因为如果所有键测试相等,则会比较每对元素的索引

换句话说,您可以通过在comparator函数中包含两个元素的原始索引的比较作为回退,使任何快速排序保持稳定


来源:

是的,但这仅适用于LINQtoSQL和其他数据库Linq提供程序。Linq不仅仅是一个ORM。。。(Linq到对象,Linq到XML…)+1用于查找。但一个简单的测试表明,当int的反向排序列表中的元素数量增加时,时间消耗没有增加n^2,根据en.wikipedia.org/wiki/Quicksort我尝试了1k和1M元素最坏情况,时间消耗只增加了大约50times@EvAlex快速排序不会在二次时间内运行。嗯,可以,但这是上限,很少见。如果是theta(n**2),每个人都会使用mergesort。现在.NETCore向所有人开放:)为什么不仔细看看呢?如果我有一个只被引用为
IEnumerable
的对象,Linq如何知道它是Linq to Objects还是其他东西?IEnumerable总是Linq to Objects(而IQueryable是Linq to anythis)@Dai IEnumerable是一个接口,所以它实际上取决于底层集合的类型(我不同意@John)。例如,List实现IEnumerable,您可以将一个List声明为IEnumerable。如果在此列表上执行order by,将使用Linq to objects提供程序。另一方面DbSet还实现了IEnumerable。如果在此数据库集上执行order by,即使它声明为IEnumerable,也将使用Linq to sql提供程序。如果您想在数据库集上使用linq to对象,可以执行dbset.AsEnumerable().OrderBy(lambda)@DanielGarcíaRubio数据库集不直接实现IEnumerable,而是实现IQueryable,后者反过来总是实现IEnumerable。所以我不完全理解你为什么不同意John的观点,因为他说的是正确的。坚持地说,Linq的
OrderBy
不是为了稳定性而指定的<代码>可枚举。OrderBy被指定为稳定,其他提供商也可以自由提供该承诺,但可能不提供。这样做可能是不可能的,也可能是非常昂贵的(考虑到它对并行化的影响,例如p-linq),或者是相对便宜的,这对提供商的工作有很大影响。一篇非常相关的帖子。给这个[c#]贴标签会不好吗?或者至少是[.net]?我错过了这个问题,因为我所有的查询都是从[c#]开始的(除非那天我碰巧在做javascript)…我已经寻找了一段时间的开源链接,谢天谢地,理论上,你可以通过在比较器中包含原始索引来稳定任何排序算法。挑战在于找出跟踪这些原始索引的最佳数据结构。