返回C#中foreach循环中的一次迭代

本文关键字:一次 迭代 foreach 循环 返回 | 更新日期: 2023-09-27 17:58:21

我有一个foreach循环,它迭代C#中treeView的不同级别,其简化版本如下:

foreach (TreeNode childNode in currentNode.Nodes)
{
    if (!someCondition)
    {
        currentNode.Remove();                    
    }
}   

但问题是,当一个节点(例如,从node1、node2、node3和node4的列表中)被删除时,该列表变得更短,并且foreach循环跳过一次迭代(例如,如果要删除node2,则该列表变成node1、node3和node4,foreach循环认为的下一个节点将是node4而不是node3)。这是因为框架将这些节点存储在数组/列表中,所以我想知道当我想从树中删除节点时,是否可以使foreach循环返回一次迭代。

我是新来的。NET框架,所以非常感谢您的帮助。

返回C#中foreach循环中的一次迭代

通过设置,使用Linq也许可以实现所需的结果

currentNode.Nodes = currentNode.Nodes.Where( n => SomeCondition( n ) ).ToList();

或者类似的东西,所以不需要显式迭代。一个不太优雅的解决方案是使用向后运行的显式for循环,这样循环索引就不会变得无效。然而,当有更具结构性的方法时,我会认为这是一种糟糕的做法。

您可以在此处使用进行循环

// Pay attention to reversed order:
// each currentNode.Remove() changes currentNode.Nodes.Count 
for (int i = currentNode.Nodes.Count - 1; i >= 0; --i)  {
  TreeNode childNode = currentNode.Nodes[i];
  if (!someCondition) {
    currentNode.Remove();                    
  }
}
不,这是不可能的,因为foreach循环的迭代不是严格意义上的"索引"
然而,for循环是索引的,因为您自己为它提供了计数机制。在那里你可以换柜台。

通常,在foreach中修改正在迭代的集合不是一个好主意。您应该考虑使用for循环,并手动跟踪当前索引。