C# 为什么在大多数情况下,traversal只向前移动?

C# 为什么在大多数情况下,traversal只向前移动?,c#,.net,data-structures,iterator,traversal,C#,.net,Data Structures,Iterator,Traversal,我注意到很多迭代器或数据读取器都是向前的,就像、,还有更多(你知道的) 因此,简单地问一下为什么它们只向前通常,当我为自己的定制需求创建数据迭代器时,我通常会尝试在两侧添加对导航的支持。我同意大多数时候我们不需要反向遍历,但有时我们确实需要,因此我们最终创建temp变量或在需要时保存数据的东西 因此,我的问题是: 为什么大多数数据迭代器只向前 在创建可向后遍历的迭代器/数据读取器时,我错了吗。如果不是,为什么框架对其内置的数据迭代器没有这样的支持 我们是否有任何严重的性能缺陷,或者它只是没有

我注意到很多迭代器或数据读取器都是向前的,就像、,还有更多(你知道的)

因此,简单地问一下为什么它们只向前通常,当我为自己的定制需求创建数据迭代器时,我通常会尝试在两侧添加对导航的支持。我同意大多数时候我们不需要反向遍历,但有时我们确实需要,因此我们最终创建
temp
变量或在需要时保存数据的东西


因此,我的问题是:

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

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

  • 我们是否有任何严重的性能缺陷,或者它只是没有被认为是一个好的设计有这样的功能


这个问题从一开始就困扰了我很多,但一直没有得到满意的答案,所以我在这里问。我相信许多开发人员可能会同意我的观点,即反向遍历有时是有用的。

仅向前”是:

  • 大多数消费者最常用的
  • 易于实现,因此最有可能由大多数生产商实现
  • 如果我们假设不想缓冲内存中的所有数据,那么我们唯一能保证的就是
  • 易于缓冲以允许随机访问(对于中等大小的数据)
例如,如果您正在从数据库、网络流等读取数据,则只能保证“转发”。我们当然不想随意缓冲所有这些数据——它可能是巨大的

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

例如,考虑这个<强>完全有效< <强>序列:

public static IEnumerable<int> LotsOfData() {
    var random = new Random();
    while(true) yield return random.Next();
}
公共静态IEnumerable LotsOfData(){
var random=新的random();
while(true)收益率返回random.Next();
}
  • 没有缓冲就无法反转
  • 它的长度是无限的,因此无法缓冲

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

在这种情况下,您肯定是对的,但在从大文件中读取数据时,如果我们稍微向后读取,会有什么问题呢。。逻辑将类似于将指针以位形式移回某个计数器,然后再次读取。。当然,我们需要编写更多的代码。。那么,这种设计会出什么问题呢?好吧,我们的想法是有一种通用的基本方法,可以(基本上)适用于所有东西。没有什么可以阻止您在特殊情况下使用其他访问方案(如反向读取或随机访问)基本SRP:)。不要向对象添加非基本功能。还有,我喜欢bullet 4。如果需要的话,很容易添加缓冲。@Shekhar-问题是它将te调用程序限制为可查找的流。如果您只需要返回一小段时间,那么显然有一些方法可以处理这一点,比如循环缓冲区。