首页 > 解决方案 > IEnumerator.ToArray() 是如何实现的?

问题描述

对于IEnumerator.ToList(), 似乎很明显它将迭代MoveNext(), Add(Current), 直到遇到终点。

但是对于 Array,我没有看到任何聪明的方法来做到这一点。在不知道 IEnumerator 的计数的情况下,它将一次又一次地创建数组,将它的长度增加 1,MoveNext()直到它遇到结束。我敢肯定,这绝对不是这种方式。

内部如何ToArray()实施?

标签: c#loops

解决方案


真的没有什么神奇的,结果缓冲区以 a 的方式增长List<T>(确切的代码取决于您使用的框架和版本),但它仍然是相同的。

  1. 缓冲区大小将从 size 开始,4并且每次需要容量时都会将大小增加一倍。例如8, 16, 32, 64, ...

  2. 每次它增加时,它将使用快速的内存(样式)副本来传输数据。

  3. 最终结果将分配复制它需要的大小。

是的,有分配,枚举的结果越大,它执行的分配就越多,尽管即使在最坏的情况下它们也是最小的。

注意:如果你想减少代码中的分配,那么最好远离不断增长的缓冲区和导致它们的神奇野兽


推荐阅读