- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
This thread表示 LINQ 的 OrderBy
使用快速排序。考虑到 OrderBy
返回一个 IEnumerable
,我正在努力理解它的意义。
我们以下面这段代码为例。
int[] arr = new int[] { 1, -1, 0, 60, -1032, 9, 1 };
var ordered = arr.OrderBy(i => i);
foreach(int i in ordered)
Console.WriteLine(i);
循环相当于
var mover = ordered.GetEnumerator();
while(mover.MoveNext())
Console.WriteLine(mover.Current);
MoveNext()
返回下一个最小的元素。 LINQ 的工作方式,除非您使用 ToList()
或类似方法“兑现”查询,否则不应创建任何中间列表,因此每次调用 MoveNext ()
IEnumerator
查找下一个最小元素。这没有意义,因为在执行快速排序期间,没有当前最小元素和下一个最小元素的概念。
我的思路哪里出了问题?
最佳答案
the way that LINQ works, unless you "cash out" of the query by use ToList() or similar, there are not supposed to be any intermediate lists created
这个说法是错误的。你的思维缺陷在于你相信了一个错误的陈述。
LINQ to Objects 实现很聪明地以合理的成本延迟工作。正如您正确注意到的那样,在排序的情况下是不可能的。 OrderBy
生成一个对象作为其结果,当调用 MoveNext
时,该对象枚举整个源序列,在内存中生成排序列表,然后枚举排序列表。
同样,连接和分组也必须在枚举第一个元素之前枚举整个序列。 (逻辑上,连接只是带有过滤器的叉积,工作可以分布在每个 MoveNext() 上,但效率很低;为了实用,构建了一个查找表。它是计算渐近空间与时间权衡的教育意义;试一试。)
源代码可用;如果您对实现有疑问,我鼓励您阅读它。或者查看 Jon 的“edulinq”系列。
关于c# - LINQ 的 OrderBy 如何与 MoveNext 相媲美?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38005943/
This thread表示 LINQ 的 OrderBy 使用快速排序。考虑到 OrderBy 返回一个 IEnumerable,我正在努力理解它的意义。 我们以下面这段代码为例。 int[] arr
快速浏览一下 stackoverflow,我还没有找到(所以希望这不是重复的问题)类似的问题(也有很长的内容)。我也相信TJ holowaychuck,他创建了很多优秀的node.js(javascr
我有这样的数据 location sales store 0 68 583 17 1 28 857 2 2 55
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一名优秀的程序员,十分优秀!