2016-09-29 8 views
-1

次のスニペットでは、値がリストに存在しない場合、ツリーの子ノードを非表示にしようとしています。現在、私は63の子ノードを持っていますが、ループは上位32の値を繰り返します。完全な数の子ノードでは実行できませんでした。あなたが問題を診断することを提案したら、私は感謝します。forループは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

あなたremoveAt(0)は、あなたが62個のノードを持っているとiがインデックス1で以前にあったノードは、インデックス0になりましたし、スキップされます1にインクリメントする場合は、63個のノードを持って開始します。 forループは実際にはそのノードを実際には見ません。これは、ノードの半分だけをチェックする方法で繰り返されます。最後のインデックスから始めて0に戻して、ノードを削除してもまだチェックしていないリストのノードに影響を与えないようにする必要があります。

リストまたは配列に対してループを反復してループ内で変更することは、常にforを監視する必要があります。これが起こると、多くの毛深い状況が発生する可能性があります。

関連する問題