返回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框架,所以非常感谢您的帮助。
通过设置,使用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循环,并手动跟踪当前索引。