3

重複の可能性:
foreach でリストを変更する最良の方法は何ですか?

があり、次のObservableCollection mycollectionような列挙子で何かをしたいとします。

foreach(var x in mycollection)
{
   // This will do something based on data of x and remove x from mycollection
   x.Close();
}

このメソッドClose()には 1 行のコードがあります - mycollection.Remove(x);. このコードを実行すると、次のエラーが発生します。

コレクションが変更されました。列挙操作が実行されない場合があります。

Close()アプリケーションの他の多くの場所で呼び出されるため、メソッドを変更できません。この問題を解決するにはどうすればよいですか?

4

3 に答える 3

8

コレクションの列挙中にアイテムを削除することはできません。簡単な解決策の 1 つはfor、最後の項目から最初の項目へのループを使用し、必要に応じて削除することです。

for (int i = myCollection.Count - 1; i >= 0; i--)
{
    var item = myCollection[i];
    if (ShouldDelete(item))
    {
        item.Close();
    }
}
于 2012-08-01T13:47:57.317 に答える
2

これにアプローチするには、次の 2 つの方法があります。

  1. リストからすべてを削除する必要がない場合は、を使用してforeach「クローズするアイテム」の別のリストを入力し、.Close完了したら 2 番目のリストの各アイテムを呼び出します。mycollectionそうすれば、列挙中に変更を回避できます。
  2. リスト内のすべてCloseのアイテムを呼び出している場合は、代わりにこれを試してください。

    while (mycollection.Count > 0
    { 
         mycollection[0].Close()) 
    }
    
于 2012-08-01T13:47:33.913 に答える
0

foreach では、mycollection.ToList()代わりに使用します。

于 2012-08-01T13:46:45.023 に答える