2

查看一些代码System.Linq,我遇到了一些Buffer<TSource>使用示例。

在示例中Enumemerable.ReverseIterator,使用 Buffer 有什么好处?

private static IEnumerable<TSource> ReverseIterator<TSource>(
                                                        IEnumerable<TSource> source)
    {
      Buffer<TSource> buffer = new Buffer<TSource>(source);
      for (int i = buffer.count - 1; i >= 0; --i)
        yield return buffer.items[i];
    }
4

2 回答 2

2

好吧,有些东西需要读取整个序列,以便它可以以相反的顺序返回它们。Buffer<TSource>在这里是一种选择,也是一种有效的选择——但它可以ToArray()or来实现ToList()。缓冲区允许创建“超大”数组(与创建列表的方式相同,但版本控制较少等),而无需在ToArray.

您可能会发现我的一些Edulinq(我对 LINQ to Objects 的娱乐和教育的重新实现)文章很有趣,包括:

(故意按照这个顺序,因为它们显示了一个导致类似“缓冲”想法的演变。)

于 2012-06-23T20:02:52.587 回答
1

缓冲区比ToList由于List<T>迭代器的验证和版本控制而具有一些内部开销更有效。ToArray需要到最终的副本通行证。

此外, Buffer 是一种结构,避免了一次分配。

Buffer<T>是一个没有这些开销的内部类。这纯粹是性能优化。

于 2012-06-23T20:07:23.597 回答