c# - 为什么 Iterator 定义 remove() 操作?

标签 c# java iterator ienumerator

在 C# 中,IEnumerator接口(interface)定义了一种遍历集合并查看元素的方法。我认为这非常有用,因为如果你通过 IEnumerable<T>对于一个方法,它不会修改原始源代码。

但是,在 Java 中,Iterator定义 remove操作(可选!)允许删除元素。通过 Iterable<T> 没有任何优势方法,因为该方法仍然可以修改原始集合。

remove可选性refused bequest 的一个例子气味,但忽略它(已经讨论过 here )我会对促使 remove 的设计决策感兴趣在接口(interface)上实现的事件。

导致 remove 的设计决策是什么?正在添加到 Iterator

换句话说,明确没有 remove 的 C# 设计决策是什么?定义于 IEnumerator

最佳答案

Iterator 能够在迭代期间移除元素。您不能使用迭代器迭代集合,也不能使用该集合的 remove() 方法从目标集合中删除元素。在下次调用 Iterator.next() 时,您将得到 ConcurrentModificationException,因为迭代器无法知道集合究竟是如何更改的,也不知道如何继续迭代。

当您使用迭代器的 remove() 时,它知道集合是如何更改的。此外,实际上您不能删除集合中的任何元素,只能删除当前元素。这简化了迭代的继续。

关于传递迭代器或 Iterable 的优势:您始终可以使用 Collection.unmodifireableSet()Collection.unmodifireableList() 来防止修改您的集合。

关于c# - 为什么 Iterator 定义 remove() 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11648389/

相关文章:

c# - ComboBox:在代码隐藏中设置 SelectedIndex 后与第一项的绑定(bind)错误

java - 格式化 double 以省略不必要的 ".0"并且从不四舍五入

java - 如何在 JGROUPS 中禁用 FIFO 和重传协议(protocol)?

python - 如何在for循环python中使用计数器

c# - 存储对在构造函数初始化程序中创建的对象的引用

c# - 使用股票报价数据构建基于时间的条形图

c# - 有没有办法在机器上没有word的情况下动态生成word文档

java - 如何将快照监听器正确添加到 Java 中的 Firebase Firestore 文档引用?

ruby - 如何在 Ruby 中删除数组的末尾

c++ - --begin(container) - 是定义的行为吗?