¿Cómo se puede iterar fácilmente a través de todos los nodos en un TreeView, examinar su propiedad Chequeada y luego eliminar todos los nodos marcados?Cómo eliminar eficientemente los elementos verificados de un TreeView?
Parece sencillo, pero se supone que no debe modificar una colección a través de la cual está iterando, eliminando la posibilidad de un bucle "foreach". (La llamada .Nodes.Remove está modificando la colección). Si se intenta, el efecto es que solo se eliminan aproximadamente la mitad de los nodos comprobados.
Incluso si tuviera que usar dos pasadas: primero creando una lista de índices temporales, y luego eliminando por índice en la segunda pasada - los índices cambiarían en cada eliminación, invalidando la integridad de la lista de índices.
Entonces, ¿cuál es la forma más eficiente de hacer esto?
Aquí es un ejemplo de código que se ve bien, pero en realidad sólo elimina aproximadamente la mitad de los nodos .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);
}
}
}
(Sí, la intención es únicamente para podar los nodos de un árbol que es de dos niveles profundos.)
Este es el método más eficiente. – Romias
Pregunta anterior, pero +1 por ser el método más eficiente. – TimFoolery
Revisando esto ... algunas modificaciones lo harían ligeramente más rápido ... haciendo los siguientes cambios en el encabezado for-loop: 'int ndx = nodes.Count-1' y' ndx> = 0' le permitirán para evitar el -1 que ocurre en cada pasada a través del bucle. En el gran esquema de las cosas, algunas restas adicionales no significarán mucho en absoluto, pero oye ... ¿por qué no? – TimFoolery