【发布时间】:2010-12-08 10:52:23
【问题描述】:
在 SO 上已多次询问如何实现双向枚举器(here、here)。我的问题不是如何(这对大多数情况来说都是微不足道的),而是为什么在.NET平台中不存在这种类型。
public interface IBidirectionalEnumerator<T> : IEnumerator<T>
{
bool MovePrev();
}
显然,有许多集合类型无法实现这一点,因为MoveNext() 具有破坏性或会更改底层集合的状态。但相反,许多类型可以轻松实现这一点(List、IList、LinkedList、array)。
为什么不存在这种类型?
【问题讨论】:
-
如果枚举它会改变它的状态,那么你的集合设计就有很大的问题。
-
同意。但是确实有一些集合在枚举时应该改变,比如堆栈或队列。
-
除非您使用 IEnumerable 包裹在流式传输类型或系统资源(如 StreamReader 或文件列表)上。
-
另外,虽然所有集合都是枚举,但并非所有枚举都是集合。
-
同意马修,我的评论太短视了。副作用确实没问题(流确实是一个很好的例子,查询是另一个例子),但它们必须本地化。我认为多次枚举某些东西,即使在枚举器之间来回切换,也应该是一致的。否则你会做非常不直观的事情。
标签: c# .net ienumerator enumerators