【问题标题】:Correct interface for one time only Enumeration (i.e. a "stream")仅一次正确的接口枚举(即“流”)
【发布时间】: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


【解决方案1】:

https://msdn.microsoft.com/en-us/library/system.collections.ienumerator.reset(v=vs.110).aspx

为 COM 互操作性提供了 Reset 方法。它不一定需要实施;相反,实现者可以简单地抛出 NotSupportedException。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多