Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 枚举数方法的调用顺序是什么?_C#_Linked List_Enumerator - Fatal编程技术网

C# 枚举数方法的调用顺序是什么?

C# 枚举数方法的调用顺序是什么?,c#,linked-list,enumerator,C#,Linked List,Enumerator,我想知道,因为我计划对链表使用枚举器,并且希望在程序运行期间,如果节点的数据更改为某个值,则能够删除该节点。但是,由于枚举数会让其MoveNext获取列表中的下一个节点,我想知道MoveNext是否在当前的get之后调用 换言之,如果链表枚举器在移除后立即停止,则此操作将起作用 foreach (Node<Object> it in myLinkedList) { if (it.data().isGone()) { myLinkedList.remov

我想知道,因为我计划对链表使用枚举器,并且希望在程序运行期间,如果节点的数据更改为某个值,则能够删除该节点。但是,由于枚举数会让其MoveNext获取列表中的下一个节点,我想知道MoveNext是否在当前的get之后调用

换言之,如果链表枚举器在移除后立即停止,则此操作将起作用

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,就会立即抛出异常并回答他们自己的问题。没有想到他们正在实现自己的链表,这一点在二读时就显而易见了。自我提醒:喝醉时不要浏览。