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

时间:2011-02-19 11:51:34

标签: c# .net data-structures iterator traversal

我注意到许多迭代器或数据读取器只是转发,如DataReaderXmlReaderIEnumerator,还有更多(你明白了)

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


所以我的问题是:

  • 为什么大多数数据迭代器仅向前

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

  • 我们是否有任何 严重的 性能缺陷或只是被视为良好设计有这样的功能。


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

1 个答案:

答案 0 :(得分:9)

“仅转发”是:

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

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

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

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

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

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