IEnumerable<T>
我有一个 C# 类,它需要在一堆方法中处理一系列项目( ),所以我不能简单地foreach
在一个方法中。我调用.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>
,传递它通常是一个坏主意。
我听到的最好的建议是创建我自己的类,然后传递。还有其他建议吗?