为什么大多数时间只能进行遍历?

She*_*Pro 5 .net c# iterator traversal data-structures

我注意到许多迭代器或数据读取器只是像DataReader,XmlReader,IEnumerator一样前进,还有更多(你明白了).

因此,通常只有在我为自定义需求创建数据迭代器时才会问他们为什么只是向前 -我通常会尝试添加对双方导航的支持.我同意大多数时候我们不需要向后遍历,但有时我们确实需要,因此我们最终会在需要时创建temp变量或某些东西来保存数据.


所以我的问题是:

  • 为什么大多数数据迭代器只能转发

  • 在创建一个向后可遍历的迭代器/数据读取器时了.如果没有,为什么没有框架对其内置的数据迭代器有这样的支持.

  • 我们是否有任何严重的性能缺陷,或者只是没有被认为是具有此类功能的良好设计.


这个问题从一开始就给我带来了很多麻烦,但从来没有得到满意的答案,所以我在这里问.我相信很多开发人员可能会同意我的说法,后向遍历有时会很有用.

Mar*_*ell 9

"仅转发"是:

  • 大多数消费者最常用的用途
  • 简单地实现,所以最容易大多数生产者实施
  • 如果我们假设我们不想缓冲内存中的所有数据,那么我们唯一可以保证
  • 轻松缓冲以允许随机访问(适用于中等大小的数据)

例如,如果您正在从数据库,网络流等中读取数据,则只能保证"转发".我们当然不希望随意缓冲所有数据 - 它可能是巨大的潜在.

如果客户认为他们拥有大量的数据,他们总是可以调用ToList()etc来将其缓冲在内存中并允许随机访问.

例如,考虑这个完全有效的序列:

public static IEnumerable<int> LotsOfData() {
    var random = new Random();
    while(true) yield return random.Next();
}
Run Code Online (Sandbox Code Playgroud)
  • 没有缓冲就无法逆转
  • 它的长度是无限的,所以无法缓冲

很明显,这个例子有点不太可能,但是从套接​​字,数据库甚至是大文件中读取 - 基本上都是相同的场景.