5

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

从现有数组中获取子数组

我在很多地方读过这样的答案:

从现有数组中获取子数组

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

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

4

1 回答 1

5

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

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

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

(如果您Skip在无法通过索引(如数组)访问的集合上使用,则获取第一项是 O(n) 操作,其中 n 是跳过的项目数。)

于 2011-09-09T09:27:52.950 回答