我有一个C#类需要在一堆方法中处理一系列项目(IEnumerable< T>),所以我不能简单地在一个方法中进行操作.我调用.GetEnumerator()并传递此IEnumerator< T>周围,它工作得很好,给我提供了循环一个序列时所需的灵活性.
现在我想让其他人在这个过程中添加逻辑.最自然的方法是为它们提供一个接口,该接口具有接受IEnumerator< T>的方法.简单,完成,它的工作原理.
但我担心这是一种反模式.他们必须知道IEnumerator< T>已经调用了.MoveNext(),因此他们可以简单地访问.Current.另外,我没有看到使用IEnumerator< T>的任何先例.在要实现的接口中.
>我不考虑哪些陷阱?
>是否存在另一种模式,它将允许我这种相同的有效机制(即,我不希望创建/销毁多个副本)而不暴露IEnumerator< T>本身?
更新:正如我在下面的评论中提到的:我想要的是某种通用Stream< T>.我需要能够有效地看到下一个项目(IEnumerator.Current – > .Peek())并使用它(IEnumerator< T> .MoveNext() – > .Pop()).
我使用IEnumerator< T>因为它明智地符合法案界面.我喜欢在适合时使用常见的BCL类型,但似乎我在滥用这个类型.
所以问题3)是否有适合这种需要的课程?或者我应该创建自己的Stream,懒惰地执行IEnumerator< T>内部?然后它将被完全封装.我不想使用许多现有的集合,因为它们有内部存储,而我希望存储是IEnumerable< T> iteslf.
好吧,这听起来像是对IEnumerator< T>的共识.通常是ValueType以及不知道IEnumerator< T>的状态的先验,传递它通常是个坏主意.
我听过的最好的建议是创建我自己的类,它会被传递.还有其他建议吗?
解决方法:
如果我理解正确,你有很多方法可以在序列上调用MoveNext,并且你希望这些方法相互合作,所以你传递一个IEnumerator< T>.正如你所提到的,这里肯定有一些紧耦合,因为你希望枚举器在每个方法的入口处处于特定状态.这听起来像你在这里真正的东西就像Stream类,它既是一个集合(一种)和一个迭代器(有一个当前位置的概念).我会在你自己的类中包装你的迭代和你需要的任何其他状态,并将各种方法作为该类的成员