C# 枚举数方法的调用顺序是什么?
我想知道,因为我计划对链表使用枚举器,并且希望在程序运行期间,如果节点的数据更改为某个值,则能够删除该节点。但是,由于枚举数会让其MoveNext获取列表中的下一个节点,我想知道MoveNext是否在当前的get之后调用 换言之,如果链表枚举器在移除后立即停止,则此操作将起作用C# 枚举数方法的调用顺序是什么?,c#,linked-list,enumerator,C#,Linked List,Enumerator,我想知道,因为我计划对链表使用枚举器,并且希望在程序运行期间,如果节点的数据更改为某个值,则能够删除该节点。但是,由于枚举数会让其MoveNext获取列表中的下一个节点,我想知道MoveNext是否在当前的get之后调用 换言之,如果链表枚举器在移除后立即停止,则此操作将起作用 foreach (Node<Object> it in myLinkedList) { if (it.data().isGone()) { myLinkedList.remov
foreach (Node<Object> it in myLinkedList)
{
if (it.data().isGone())
{
myLinkedList.remove(it);
}
}
public boolean remove(Node<E> node)
{
node.setData(node.next().data());
node.setNext(node.next().next());
}
根据IEnumerator的文档,如果在创建枚举数后修改集合,MoveNext方法将抛出InvalidOperationException
即使您实现了自己的枚举器(包括.NET中包含的精选少数枚举器),也不应修改foreach语句中枚举该集合元素的集合,因为这是代码可能引发异常的直接视觉指示。根据IEnumerator的文档,如果在创建枚举数后修改集合,MoveNext方法将引发InvalidOperationException
即使您实现了自己的枚举器(包括.NET中包含的精选少数枚举器),也不应修改foreach语句中枚举该集合元素的集合,因为这是代码可能引发异常的直观指示。IEnumerator的合同特别要求您不要执行计划执行的操作。在枚举集合时修改集合总是错误的。如果是这样,那么您应该放弃枚举。我是c语言中尝试枚举的新手,我仍然不知道我的枚举是否正确或有效。@EricLippert Edit:在枚举集合元素时修改集合是个坏主意。也就是说,不要求枚举器在由Remove方法修改的数据的同一视图上操作。例如,System.collections.Concurrent中的大多数集合通过创建和枚举基础集合的时间点快照来实现GetEnumerator,因此,允许在枚举时进行修改。@user2375782:如果要定义自己的链表类,请使用签名void RemoveFunc谓词创建一个方法,该方法可以安全地修改列表以删除与谓词匹配的所有项。这就是列表的作用。对不起,我只是想,一旦他们尝试使用LinkedList,就会立即抛出异常并回答他们自己的问题。没有想到他们正在实现自己的链表,这一点在二读时就显而易见了。自我提醒:喝醉时不要浏览。IEnumerator的合同特别要求你不要做你计划做的事情。在枚举集合时修改集合总是错误的。如果是这样,那么您应该放弃枚举。我是c语言中尝试枚举的新手,我仍然不知道我的枚举是否正确或有效。@EricLippert Edit:在枚举集合元素时修改集合是个坏主意。也就是说,不要求枚举器在由Remove方法修改的数据的同一视图上操作。例如,System.collections.Concurrent中的大多数集合通过创建和枚举基础集合的时间点快照来实现GetEnumerator,因此,允许在枚举时进行修改。@user2375782:如果要定义自己的链表类,请使用签名void RemoveFunc谓词创建一个方法,该方法可以安全地修改列表以删除与谓词匹配的所有项。这就是列表的作用。对不起,我只是想,一旦他们尝试使用LinkedList,就会立即抛出异常并回答他们自己的问题。没有想到他们正在实现自己的链表,这一点在二读时就显而易见了。自我提醒:喝醉时不要浏览。