我正在浏览这个问题和一些类似的问题:
Getting a sub-array from an existing array
很多地方我都读到这样的答案:
Getting a sub-array from an existing array
我想知道为什么Skip和Take不是数组的恒定时间操作?
反过来,如果它们是常量时间操作,那么Skip和Take方法(最后没有调用ToArray())不会有相同的运行时间而没有做Array.Copy的开销,而且还有更多的空间效率?
答案 0 :(得分:5)
您必须区分Skip
和Take
方法所做的工作,以及使用方法返回的数据的工作。
Skip
和Take
方法本身就是O(1)操作,因为它们所做的工作不会随输入大小而扩展。他们只是设置了一个能够从数组中返回项目的枚举器。
当您使用枚举器时,工作已完成。这是一个O(n)操作,其中n是枚举器产生的项目数。当枚举器从数组中读取时,它们不包含数据的副本,只要您使用枚举器,就必须保持数组中的数据完整。
(如果对索引无法访问的集合使用Skip
,则gettting第一项是O(n)操作,其中n是跳过的项目数。)