2011-08-15 35 views
1

メインリスト内のすべてのリストを繰り返し、特定の条件が発生した場合は繰り返します。私はその特定のリストを削除したい。ループ内のリストからリストを安全に削除する

動作しません。

for (int i = 0; i < mainList.Count; i++) 
{ 
    if (mainList[i].Dead == true) // 
    { 
      mainList.removeAt(i);//what will be affect on mainList.Count; 
    } 
} 
+0

[C#でそれを反復しながら、列挙コレクションから項目を変更または削除する方法]の可能複製(HTTP ://stackoverflow.com/questions/308466/how-to-modify-or-delete-items-from-an-enumerable-collection-while-terating-throu) –

答えて

9
mainList.RemoveAll(x => x.Dead); 
+1

私は子羊の味を楽しむようになっています –

0

あなたがそうしているときに、リストの長さを変更しているので、あなたはそれを行うことはできません。私が代わりにこのようにそれを行うだろう:あなたはループのためにあなたを構築

var newList = mainList.Where(y => !y.Dead).ToList(); 
+0

これは要素を削除しませんが、newList frのすべての項目を削除するには、さらに手を加える必要がありますom mainList ... – shelleybutterfly

+0

いいえ、それは新しいリストを作成するアイテムを削除しません。受け入れられた解決策は、シーンの後ろにあるものの、実行が遅れてしまいます。 –

+0

まあ、それは、受け入れられた解決策がリストを逆方向に反復し、RemoveAt(i)を使用して項目を削除するように見えるので、あなたが何を意味するのか分からない。 (あなたが不完全であり、悪い考えとしてコメントされた他の提案された可能な解決策を意味する場合を除き)、違反は意図されていませんでした。私はあなたの回答が質問に答えないと指摘しました。ステップ。 – shelleybutterfly

3

方法、mainList.Count滞在一定の場合にのみ動作しますが、あなたはあなたのループの中に要素を削除しています。それがなぜ問題なのか理解していますか?要素を削除すると、その要素のチェックをスキップします。

私はあなたがforeachmainList.removeを使用できると思いますが、わかりません。別の解決策は、ちょうどあなたのループが下向きに数えるようにすることです:

for (int i = mainList.Count-1; i >= 0; i--) 
{ 
    if (mainList[i].Dead == true) 
    { 
     mainList.removeAt(i); 
    } 
} 
+0

いいえあなたはforeachを使用して削除するべきではありません。それはあなたが反復しているリストを悪いものに変更します。 –

関連する問題