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>,传递它通常是一个坏主意。
我听到的最好的建议是创建我自己的类,然后传递。还有其他建议吗?