首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当类没有实现IEnumerable时,GetEnumerator方法应该仍然是幂等的吗

当类没有实现IEnumerable时,GetEnumerator方法应该仍然是幂等的吗
EN

Stack Overflow用户
提问于 2010-11-16 21:58:58
回答 4查看 303关注 0票数 2

这个问题引用了另一个我提出的关于滥用IEnumerable接口的question,即在迭代时修改对象。

普遍的共识是,任何实现IEnumerable的东西都不应该是幂等的。但是.net支持使用foreach语句进行编译时的鸭子类型。任何提供IEnumerator GetEnumerator()方法的对象都可以在foreach语句中使用。

那么,在实现IEnumerable时,GetEnumerator方法应该是幂等的吗?

编辑(已添加上下文)

我的建议是,当在队列上迭代时,每个项都会随着队列的移动而出列。此外,在调用GetEnumerator之后推送到队列中的任何新对象仍将被迭代。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-16 22:06:38

它不是幂等的类型-这甚至没有多大意义;你可能是指不可变的,但这并不清楚。这是GetEnumerator方法本身,它通常是幂等的。

虽然我会说这是典型的情况,但我可以设想在特殊情况下,拥有一个非幂等的GetEnumerator方法是有意义的。例如,可能你的数据只能读取一次(因为它是从web服务器流传送过来的,而该服务器不会再次服务于相同的请求,或者类似的东西)。在这种情况下,GetEnumerator必须有效地使数据源无效,以便将来的调用将抛出异常。

当然,这些类型和方法应该非常仔细地记录下来,但我认为它们是合理的。

票数 3
EN

Stack Overflow用户

发布于 2010-11-16 22:15:53

这是一个古老的讨论,据我所知,没有共同的共识。

请不要混淆(运行时)Duck类型的概念和滥用编译器支持的foreach来支持您想要的语义。

您似乎混淆的另一个概念是幂等性与不可变性。根据您的措辞,您尝试描述第二个,这意味着提供枚举器的对象在枚举过程中被修改。另一方面,幂等性意味着您的枚举数,当调用两次时,将产生相同的结果。

现在我们已经清楚了这一点,您需要仔细决定您的IEnumerable操作应该支持的语义。某些类型的枚举很难使幂等(即涉及缓存),并且通常属于以下类别之一:

在随机变化的数据(即随机数生成器、共享状态(例如文件、数据库、流等)上的传感器streams)

  • Enumerating )上枚举

另一方面,这只考虑了“源”操作。如果要使用枚举数实现筛选器或转换操作,则应始终尝试使它们幂等。

票数 3
EN

Stack Overflow用户

发布于 2010-11-16 22:56:24

看起来你想要一个queue类,你可以在一个很好的一行程序中将所有的项目从队列中取出。

这个想法本身并没有错;我只是质疑您是否愿意专门使用GetEnumerator来实现您想要的东西。

为什么不简单地编写一个在功能方面更明确的方法呢?例如,DequeueAll,或者类似的东西。

示例:

代码语言:javascript
复制
// Just a simplistic example. Not the way I'd actually write it.
class CustomQueue<T> : Queue<T>
{
    public IEnumerable<T> DequeueAll()
    {
        while (Count > 0)
        {
            yield return Dequeue();
        }
    }
}

(请注意,上面的方法甚至可以是一个扩展方法,如果它从字面上表示您想要的唯一功能,而不是Queue<T>已经提供的功能。)

这样,您仍然可以获得我怀疑您想要的“干净”的-looking代码,而不会(潜在地)混淆非幂等的GetEnumerator

代码语言:javascript
复制
// Pretty clean, right?
foreach (T item in queue.DequeueAll())
{
    Console.WriteLine(item);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4194900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档