2016-09-29 3 views
-1

В следующем фрагменте я пытаюсь скрыть дочерний узел дерева, если в списке нет значения. В настоящее время у меня 63 дочерних узла, но цикл повторяется для верхних 32 значений. Я не мог запустить его для полного числа дочерних узлов. Я буду благодарен, если вы предложите диагностировать проблему.Для цикла повторяется половина времени в C#

for (int i = 0; i < docTree.Nodes[0].ChildNodes.Count; i++) 
{ 
    if (tempList.Contains(docTree.Nodes[0].ChildNodes[i].Value)) 
    { 

    } 
    else { 
     docTree.Nodes[0].ChildNodes.RemoveAt(i); 
    } 
} 
+2

Итерации назад. Вы удаляете узлы по мере их перебора по ним, что изменяет позиции индекса существующих узлов. – LarsTech

+0

Или добавьте 'i -;' после удаления, чтобы синхронизировать –

ответ

3

При запуске у вас есть 63 узлов, если вы removeAt(0) то есть 62 узлов и i будет увеличиваться на 1. Узел, который был ранее с индексом 1 теперь с индексом 0, и будет пропущен. Ваш цикл for никогда не смотрит на этот узел. Это повторяется таким образом, что вы будете проверять только половину узлов. Вы должны начинать с последнего индекса и уменьшаться до нуля, чтобы удаление узла не повлияло на узлы в списке, который вы еще не проверили.

Вы должны всегда следить за циклом for, перебирая список или массив и изменяя его в цикле. Когда это произойдет, может возникнуть много волосатых ситуаций.

Смежные вопросы