私は数字のリストを持っています。私はすべての偶数を削除したいと思います。私は自分のコードが正しいと思う:list.remove()偶数の例外
System.Collections.Generic.List<int> list = ...
foreach (int i in list)
{
if (i % 2 == 0)
list.Remove(i);
}
しかし、私はそれを実行すると例外が発生します。私は間違って何をしていますか?
私は数字のリストを持っています。私はすべての偶数を削除したいと思います。私は自分のコードが正しいと思う:list.remove()偶数の例外
System.Collections.Generic.List<int> list = ...
foreach (int i in list)
{
if (i % 2 == 0)
list.Remove(i);
}
しかし、私はそれを実行すると例外が発生します。私は間違って何をしていますか?
foreach
は、表の下にあるIEnumerator
を使用します。リスト内の要素が削除されると、列挙子は矛盾する可能性があります。それが行う最も安全なことは例外をスローすることです。これを回避するには
、最初にあなたのコレクションのローカルコピーを作成:
var local = new List<int>(list);
foreach (int i in local) { if (i % 2 == 0) list.Remove(i); }
ありがとうございます。それは有り難いです。 – user1100941
@ user1100941問題ありません、お楽しみください! –
を。 (それは、むしろ既存のリストからオッズを削除するよりも、ちょうど偶数番号の新しいリストを作成し、それはあなたがする探しているものに依存します。)
var numbers = Enumerable.Range(1, 100);
var evens = numbers.Where(n => n % 2 == 1);
この場合、オッズを維持しているのでオッズ(n%2 == 1)が必要です。 – Dracorat
良い呼び出し - 更新済み –
あなたのすべてのforeach
ループがあるから抜け出しますreadonly
リスト内の項目を変更しようとすると、例外が発生する理由が説明されます。 この記事の内容は右hereで説明されています。 いつもfor
ループに切り替えることができます。
for (int i = 1 ; i < list.lenght; i++)
{
if (i % 2 == 0)
list.Remove(i);
}
あなたが何かのリストから削除する場合は(あるいは配列)あなたがアイテムを削除すると、それを逆方向に反復すべきでは1位で、それの後にすべての項目をシフトダウン。前方に反復すると、毎回次の項目をスキップします。
例外はありますか?ときどきforeachはforeachで使用されているときに編集できない場所にアイテムをロックします。代わりに、使用(および後方に行く!)
for(int i = list.Length - 1 ; i > -1 ; i--)
あなたはforeach
ループ中に、コレクションを変更することはできません。 foreach
ループは、コレクションをループする列挙子を使用して、コレクションが変更されたとき、これは列挙子に何が起こるかです:
列挙子は限りコレクションが 変わらとして有効です。追加、 要素の変更、削除など、コレクションに変更が加えられた場合、列挙子は無効になり、 は無効になり、その動作は定義されません。
通常のfor
ループを使用できます。
for (int i = 0; i < list.Count; i++)
{
int n = list[i];
if (n % 2 == 0)
{
list.RemoveAt(i--);
}
}
@Chris Filstowの方法に従う...
これはあなたのリストを取り、要素はあなたの基準を満たす新しいものと交換します。私には多くの意味を成して
System.Collections.Generic.List<int> list = ...
list = list.Where(n=> n % 2 == 0).ToList();
。返信してくれてありがとう。そして、ポストをフォーマットしてくれたBrandonに感謝します。ここに初めて投稿するのです。私は外出先で学びます。 – user1100941