Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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# 删除foreach循环中的节点_C# - Fatal编程技术网

C# 删除foreach循环中的节点

C# 删除foreach循环中的节点,c#,C#,看看这个csharp代码,看看你是否能告诉我为什么在我从列表中找到并删除一个项目后需要退出循环。其思想是浏览节点的邻居列表,查看其中是否存在节点n,然后删除该邻居: internal void RemoveDirected(Node n) { foreach (EdgeToNeighbor etn in this.Neighbors) { if (etn.Neighbor.Key == n.Key)

看看这个csharp代码,看看你是否能告诉我为什么在我从列表中找到并删除一个项目后需要退出循环。其思想是浏览节点的邻居列表,查看其中是否存在节点n,然后删除该邻居:

    internal void RemoveDirected(Node n)
    {
        foreach (EdgeToNeighbor etn in this.Neighbors)
        {
            if (etn.Neighbor.Key == n.Key)
            {
                RemoveDirected(etn);
                break;
            }
        }
    }

    internal void RemoveDirected(EdgeToNeighbor e)
    {
        Neighbors.Remove(e);
    }
。 .

注意,在第一个方法中,在RemoveDirected调用之后,我有一个“break”。 我发现如果我在被移除后不退出 它将在foreach循环中永远持续下去。我想一定是这样 与foreach的工作方式有关。如果您修改列表 foreach正在做的事情,会让人永远困惑和循环

你见过这种类型的东西吗?除了使用break,还有什么其他的选择呢? 当然,我可以将我找到的节点放在一个局部变量中,然后从循环中中断,然后 在循环之外删除它。但我在想,也许有更好的方法可以做到这一点
在csharp中。

您可以获得节点数,然后在for循环中从最高到最低进行检查和删除,这样可以避免查找不再存在的项。

当您使用.NET集合的迭代器迭代该集合时,您不能修改该集合。如果你这样做,你就是自找麻烦

您应该推迟删除,而不是在
foreach
循环中直接删除。例如,您可以在列表中收集需要删除的所有内容,然后在
foreach
之外将其删除

var toDelete = this.Neighbors.Where(etn => etn.Neighbor.Key == n.Key).ToList();
foreach (var e in toDelete) {
    Neighbors.Remove(e);
}

如果要删除项,您肯定不想使用迭代器。一个选项是将其更改为向下计数循环:

    for (int nI = this.Neighbors.Count; nI >= 0; nI--)
    {
        var etn = this.Neighbors[nI]; 
        if (etn.Neighbor.Key == n.Key)
        {
            RemoveDirected(n);
        }
    }
您还可以在循环内的集合中收集要删除的键或项,然后在完成迭代后执行删除


但是,如果只删除单个项,并且集合中的项以某种方式设置了键,那么实际上不需要任何循环。只需测试集合中是否存在密钥或项,如果存在,则将其删除。

这似乎很愚蠢。。。在哪里列出要删除的内容:P~@pst为什么?这段代码将意图传达给任何阅读它的人,因为它读起来几乎像普通英语。对我来说,这比做一些优化可能节省的CPU周期要重要得多。这看起来很愚蠢,因为哪里有过滤器。如果涉及到其他影响代码的副作用,那么是的,有时我使用这种方法。。。但不是在这样的情况下。(我想我假设邻居是不共享的,但在我的代码中这是一个更大的假设,几乎总是有效的。)感谢大家提供反馈,非常感谢。我想提出的一个要求是,请为您建议的解决方案提供代码。一个代码示例肯定会使您的推荐更加清晰。提前谢谢。如果您能提供您建议的代码示例,我将不胜感激。@FoRum check competent_tech下面的答案。
    for (int nI = this.Neighbors.Count; nI >= 0; nI--)
    {
        var etn = this.Neighbors[nI]; 
        if (etn.Neighbor.Key == n.Key)
        {
            RemoveDirected(n);
        }
    }