Как легко перебрать все узлы в TreeView, проверить их свойство .Checked и затем удалить все проверенные узлы?
Это кажется простым, но вы не должны изменять коллекцию, через которую вы выполняете итерацию, исключая возможность цикла foreach. (Вызов .Nodes.Remove изменяет коллекцию.) При попытке сделать это эффект заключается в том, что удаляется только около половины узлов .Checked.
Даже если бы кто-то использовал два прохода: сначала создание списка временных индексов, а затем удаление по индексу на втором проходе - индексы изменялись бы при каждом удалении, нарушая целостность списка индексов.
Итак, каков наиболее эффективный способ сделать это?
Вот пример кода, который выглядит хорошо, но на самом деле удаляет только около половины узлов .Checked:
foreach (TreeNode parent in treeView.Nodes)
{
if (parent.Checked)
{
treeView.Nodes.Remove(parent);
}
else
{
foreach (TreeNode child in parent.Nodes)
{
if (child.Checked) parent.Nodes.Remove(child);
}
}
}
(Да, намерение состоит только в том, чтобы обрезать узлы из двухуровневого дерева.)