为什么C#中没有ReverseEnumerator?

有没有人知道是否有特定的理由或设计决定不在C#中包含反向调查员? 如果有一个等效的C ++ reverse_iterator就好了,就像Enumerator相当于C ++ iterator 。 可以反向迭代的集合只会实现像IReverseEnumerable这样的东西,可以做类似的事情:

 List.ReverseEnumerator ritr = collection.GetReverseEnumerator(); while(rtir.MoveNext()) { // do stuff } 

这样,您就可以以相同的方式迭代Lists和LinkedLists,而不是使用索引器为另一个链接和之前的链接,从而实现更好的抽象

完全有可能实现这一点。 就个人而言,我几乎从不反向迭代。 如果我需要这样做,我先调用.Reverse()。 可能这也是.NET BCL设计师的想法。

默认情况下,所有function都未实现。 需要设计,实施,测试,记录和支持它们。 – 雷蒙德陈

这就是为什么你不实现提供很少实用性的function的原因。 您从最重要的function开始(例如从前到后迭代)。 而且你停在某个地方,你的预算已经耗尽,或者你认为没有意义继续下去。

.NET基类库中有许多不存在的东西。 直到.NET 4,甚至没有File.EnumerateLines 。 我敢说,对于大多数人来说,这种function比反向迭代更重要。

可能是您在反向迭代很常见的业务领域工作的情况。 我的经历恰恰相反。 作为框架设计师,您只能猜测谁将使用您的框架以及这些人将要求的function。 很难划清界限。

它不可用,因为IEnumerable是一个只向前的迭代器。 它只有一个MoveNext()方法。 这使得界面非常普遍并且是Linq的核心。 有许多真实世界的集合无法向后迭代,因为这需要存储 。 大多数流都是这样的。

Linq使用Reverse()扩展方法提供了一个解决方案。 它的工作原理是首先存储元素,然后向后迭代它们。 然而,这可能非常浪费,它需要O(n)存储。 它缺少对已经可索引的集合的可能优化。 你可以解决的问题:

 static class Extensions { public static IEnumerable ReverseEx(this IEnumerable coll) { var quick = coll as IList; if (quick == null) { foreach (T item in coll.Reverse()) yield return item; } else { for (int ix = quick.Count - 1; ix >= 0; --ix) { yield return quick[ix]; } } } } 

样品用法:

  var list = new List { 0, 1, 2, 3 }; foreach (var item in list.ReverseEx()) { Console.WriteLine(item); } 

您将要为LinkedList进行专门化,因为它不实现IList <>,但仍允许通过Last和LinkedListNode.Previous属性快速向后迭代。 虽然不使用该类要好得多,但它具有糟糕的CPU缓存局部性。 当您不需要便宜的插入时,总是喜欢List <>。 它可能看起来像这样:

  public static IEnumerable ReverseEx(this LinkedList list) { var node = list.Last; while (node != null) { yield return node.Value; node = node.Previous; } }