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