2011-12-15 2 views
2

私は数字のリストを持っています。私はすべての偶数を削除したいと思います。私は自分のコードが正しいと思う:list.remove()偶数の例外

System.Collections.Generic.List<int> list = ... 
foreach (int i in list) 
{ 
    if (i % 2 == 0) 
    list.Remove(i); 
} 

しかし、私はそれを実行すると例外が発生します。私は間違って何をしていますか?

+0

。返信してくれてありがとう。そして、ポストをフォーマットしてくれたBrandonに感謝します。ここに初めて投稿するのです。私は外出先で学びます。 – user1100941

答えて

10

あなたがから項目を削除することはできません あなたは、言われていることを、foreachループでコレクションを変更することはできませんlistは、foreachループで反復処理しています。代わりにforeachループの

、単にコードのこの単一のラインを使用します。あなたは、代わりにこのような何かを試みることができる

list.RemoveAll(i => i % 2 == 0); 
+2

より一般的には、 'foreach'ループでコレクションを変更することはできません。 – Marlon

+0

Marlonは正しいです。私はそれを答えに加えます。 – Gabe

2

foreachは、表の下にあるIEnumeratorを使用します。リスト内の要素が削除されると、列挙子は矛盾する可能性があります。それが行う最も安全なことは例外をスローすることです。これを回避するには

、最初にあなたのコレクションのローカルコピーを作成:

var local = new List<int>(list); 
foreach (int i in local) { if (i % 2 == 0) list.Remove(i); } 
+0

ありがとうございます。それは有り難いです。 – user1100941

+0

@ user1100941問題ありません、お楽しみください! –

1

を。 (それは、むしろ既存のリストからオッズを削除するよりも、ちょうど偶数番号の新しいリストを作成し、それはあなたがする探しているものに依存します。)

var numbers = Enumerable.Range(1, 100); 
var evens = numbers.Where(n => n % 2 == 1); 
+0

この場合、オッズを維持しているのでオッズ(n%2 == 1)が必要です。 – Dracorat

+0

良い呼び出し - 更新済み –

2

あなたのすべてのforeachループがあるから抜け出しますreadonlyリスト内の項目を変更しようとすると、例外が発生する理由が説明されます。 この記事の内容は右hereで説明されています。 いつもforループに切り替えることができます。

for (int i = 1 ; i < list.lenght; i++) 
    { 
    if (i % 2 == 0) 
    list.Remove(i); 

    } 
1

あなたが何かのリストから削除する場合は(あるいは配列)あなたがアイテムを削除すると、それを逆方向に反復すべきでは1位で、それの後にすべての項目をシフトダウン。前方に反復すると、毎回次の項目をスキップします。

例外はありますか?ときどきforeachはforeachで使用されているときに編集できない場所にアイテムをロックします。代わりに、使用(および後方に行く!)

for(int i = list.Length - 1 ; i > -1 ; i--) 
2

あなたはforeachループ中に、コレクションを変更することはできません。 foreachループは、コレクションをループする列挙子を使用して、コレクションが変更されたとき、これは列挙子に何が起こるかです:

列挙子は限りコレクションが 変わらとして有効です。追加、 要素の変更、削除など、コレクションに変更が加えられた場合、列挙子は無効になり、 は無効になり、その動作は定義されません。

通常のforループを使用できます。

for (int i = 0; i < list.Count; i++) 
{ 
    int n = list[i]; 
    if (n % 2 == 0) 
    { 
     list.RemoveAt(i--); 
    } 
} 
1

@Chris Filstowの方法に従う...

これはあなたのリストを取り、要素はあなたの基準を満たす新しいものと交換します。私には多くの意味を成して

System.Collections.Generic.List<int> list = ... 
list = list.Where(n=> n % 2 == 0).ToList();