6

今日は、ネストされた 2 つの foreach ループを使用する関数をコーディングしました。期待どおりに動作しないことを確認した後、デバッグしました。しかし、私はエラーを見ていないし、単純なエラーが私が気づいた動作を引き起こす可能性があるとは思わない.

パーツは次のようになります。

foreach(MyClass cItem in checkedListBoxItemList.Items)
{
   foreach(MyClass cActiveItem in ActiveItemList)
   {
      if (cActiveItem.ID == cItem.ID) /*...check checkbox for item...*/;
   }
}

たとえば、checkedListBoxItemList.items は MyClass タイプの 4 つの項目を保持し、ActiveItemList は 2 つの項目を持つ List< MyClass > です。

デバッガーは外側の foreach にジャンプし、内側の foreach に到達し、if を 2 回 (cActiveItem ごとに 1 回) 実行し、外側の foreach の最後に到達します。しかし、外側の foreach の 2 番目のラウンドを開始する代わりに、デバッガーは突然 MyClass.ToString() メソッドにジャンプします。このメソッドを 4 回 (checkedListBoxItemList.Items 内のアイテムの数) ステップ実行できますが、その後 ... 何も実行できません。Visual Studio に Windows フォームが表示され、foreach が続行されません。

コードを変更すると

int ListCount = checkedListBoxItemList.Items.Count;
for(int i=0; i<ListCount; i++)
{
   MyClass cItem = checkedListBoxItemList.Items[i] as MyClass;
   foreach(MyClass cActiveItem in ActiveItemList)
   {
      if (cActiveItem.ID == cItem.ID) /*...check checkbox for item...*/;
   }
}

すべてが正常に動作し、想定どおりです。私はその問題を同僚に見せましたが、彼も何が起こったのか理解していませんでした。デバッガーが MyClass.ToString() メソッドにジャンプする理由がわかりません。F10 を使用してステップスルーしたので、関数を終了する必要はありません。また、理由があるとすれば、なぜ foreach ループを継続しないのでしょうか。

これが問題である場合、私はVisual Studio 2010を使用しています。

何が起こったのか教えてください。ありがとう。

4

1 に答える 1

9

コレクションを反復処理する場合(foreachを使用)、反復処理するコレクションを変更することはできません。ただし、一致するアイテムのチェックボックスをオンにすると、外側のループ(checkedListBoxItemList.Items)のコレクションが変更され、その結果としてスローされるエラーがどこかに飲み込まれた可能性があります。それは多かれ少なかれ、あなたが突然ToStringメソッドに入り、ループを続けない理由を説明しています。

ステートメントを使用しforて反復する場合、反復を開始した時点ではコレクションへの参照がないため、その制限はありません。

これが説明することを願っています。

于 2010-04-28T14:48:12.383 に答える