【发布时间】:2018-08-17 12:10:21
【问题描述】:
我有类似流的数据结构,可以枚举一次。
目前,我有一个返回 IEnumerator 的函数,该函数内部包含此结构。这个枚举数当然不能是reset()。
这种方法意味着客户端不能尝试对流进行两次枚举,因为它们无法访问底层结构,只有一个不可重置的枚举器。
但是,我注意到 foreach 语句需要 IEnumerable 实现。
我犹豫是否提供IEnumerable 接口实现,因为在IEnumerable 的合同中隐含似乎应该能够多次枚举IEnumerable,但是我的结构不允许这样做。基本上我的结构中只能有一个枚举器。
我什至给我的枚举器提供了一个私有复制构造函数来确保这一点。
但是由于使用IEnumerator,而不是IEnumerable,我似乎失去了foreach的语法。
我正在做的是最好的方法,还是我使用了完全错误的抽象?是否有一个“流”界面可以更好地封装我想要实现的目标?我注意到有“流”数据类型,但它们处理字节。但是,我需要通过“T”对我的流进行参数化。
不幸的是,我的项目正在为 Windows XP 机器编码,所以我更喜欢与 .NET 2.0 兼容的答案,但如果这不可能,与更高版本的 .NET 版本相关的答案是可以的,至少它可能会提供一些灵感并且很有用给这个问题的未来读者。
【问题讨论】:
-
可重置合约是在 IEnumerator 上定义的,所以你已经违反了合约。我不明白添加
: IEnumerable<T>会如何使情况变得更糟。 -
我很好奇为什么它不能被重置,实际上。
-
来自:msdn.microsoft.com/en-us/library/… "Reset 方法是为 COM 互操作性而提供的。它不一定需要实现;相反,实现者可以简单地抛出 NotSupportedException。"
-
二十秒:p
-
它不能被重置,因为它是一个经过处理然后动态删除的数据流。将其全部保留为我无意使用的 reset() 将导致它最终导致系统内存不足。
标签: c# .net ienumerable ienumerator