它已经问了几次,在如何可以实现一个双向枚举(在这里,, 在这里,).我的问题是不是 如何 (这是微不足道,为大多数情况下),但是 为什么 没有这种类型的存在。网平台。

public interface IBidirectionalEnumerator<T> : IEnumerator<T>
{
    bool MovePrev();
}

显然,有许多收集型不可能实现这一点,因为 MoveNext() 是破坏性的或变化的国家的潜在收集。但相反地,许多类型的 可以 实现这个平凡(List, IList, LinkedList, array).

为什么没有这种类型的存在吗?

有帮助吗?

解决方案

  • IEnumerator支持c#foreach声明以及循环结构的其他语言。
  • 没有声明或通用编程语,IBidirectionalEnumerator使能。

其他提示

当你在设计一个框架,你必须做出不同的抽象层次做的东西决定。权衡的是,如果你选择在一个高层次的抽象的东西暴露,你会在失去对事物进行细粒度控制的成本实现泛化。如果您选择在较低的抽象级别暴露的东西,你的概念将不能一概而论很好,但你可以在一个较低的水平控制细节。

这是一个设计决策。实现两者都将是昂贵的,使框架更加臃肿,你需要增加功能时支持。你需要保留在未来的向后兼容性。这不是添加你能想到的一切BCL没有确保一件明智的事情它有显著的好处。

因为没人想过这个,或者没有人认为,这将是特别有用或者因为没有足够的预算或者...

这不是真的有必要的,是吗?你可以很容易地实现它自己。也许BCL队认为这是不值得的痛苦的实施、检测、记录等等。永远不要低估费用的一个特征,这可能听起来"方便",但它的确有成本。

特别是因为一个单一的接口,没有人实现了就会看起来很奇怪,不是吗?你希望清单,列等等。实现接口,这是一个相当大量的工作的结束。

  

显然,存在不能实现此许多集合类型,如MoveNext()是破坏性的或改变底层集合的状态。

MoveNext()是非破坏性的。事实上,如果底层集合的状态是,IEnumerator创建的时间和时间MoveNext()之间改变被调用时,在调用MoveNext()将失败。

IEnumerator的目的是遍历所有项目的集合一次,在收集的原始顺序如果集合具有本机命令。 IEnumerator不打算作为一个集合导航装置,诸如一个可能用C ++找到

此外,这将是这样做的动机是什么?为“落后”迭代语言支持?

在迭代器模式不以一组元素的“方向性”的概念得到的重量。它是用于遍历一组提供了一个简单的界面,一个简单的模式。

一个更大的问题是为什么.NET不执行IReadableByIndex,这将反过来由IList的继承。这种类型的就什么都没有添加到需要以产生工作读写IList的实现方式中,并且将具有减少的需要,以产生工作只读实现(这将实现IReadableByIndex,而不是IList的)。

这不是太有用但是思考这样的“为什么” S。 .NET是它是什么。补救对于.NET 5.0的情况下,唯一的办法是允许声明指出,将实现读写属性可以被视为隐含的接口实现一个只读版本(以便使IList的继承协变的一种手段IReadableByIndex而不必添加显式Get方法)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top