Array.Copy vs Skip and take in c#

时间:2011-09-09 09:17:58

标签: c# arrays copy skip take

我正在浏览这个问题和一些类似的问题:

Getting a sub-array from an existing array

很多地方我都读到这样的答案:

Getting a sub-array from an existing array

我想知道为什么Skip和Take不是数组的恒定时间操作?

反过来,如果它们是常量时间操作,那么Skip和Take方法(最后没有调用ToArray())不会有相同的运行时间而没有做Array.Copy的开销,而且还有更多的空间效率?

1 个答案:

答案 0 :(得分:5)

您必须区分SkipTake方法所做的工作,以及使用方法返回的数据的工作。

SkipTake方法本身就是O(1)操作,因为它们所做的工作不会随输入大小而扩展。他们只是设置了一个能够从数组中返回项目的枚举器。

当您使用枚举器时,工作已完成。这是一个O(n)操作,其中n是枚举器产生的项目数。当枚举器从数组中读取时,它们不包含数据的副本,只要您使用枚举器,就必须保持数组中的数据完整。

(如果对索引无法访问的集合使用Skip,则gettting第一项是O(n)操作,其中n是跳过的项目数。)