22

リストボックスをループしてアイテムを削除しようとすると、以下のエラーが発生します。

この列挙子がバインドされているリストが変更されました。列挙子は、リストが変更されない場合にのみ使用できます。

foreach (string s in listBox1.Items)
{
    MessageBox.Show(s);
    //do stuff with (s);
    listBox1.Items.Remove(s);
}

アイテムを削除してもコンテンツをループするにはどうすればよいですか?

4

8 に答える 8

37

すべてのアイテムを削除しますか? その場合は、foreach最初に実行してItems.Clear()から、後でそれらをすべて削除するために使用します。

それ以外の場合は、インデクサーによって逆方向にループする可能性があります。

listBox1.BeginUpdate();
try {
  for(int i = listBox1.Items.Count - 1; i >= 0 ; i--) {
    // do with listBox1.Items[i]

    listBox1.Items.RemoveAt(i);
  }
} finally {
  listBox1.EndUpdate();
}
于 2008-12-19T09:15:37.647 に答える
25

他の誰もが「後ろ向き」の回答を投稿しているので、代わりの方法を示します。削除するアイテムのリストを作成し、最後にそれらを削除します。

List<string> removals = new List<string>();
foreach (string s in listBox1.Items)
{
    MessageBox.Show(s);
    //do stuff with (s);
    removals.Add(s);
}

foreach (string s in removals)
{
    listBox1.Items.Remove(s);
}

「逆方向に作業する」方法が優れている場合もあれば、上記の方法が優れている場合もあります。特に、RemoveAll(collection)メソッドを持つ型を扱っている場合はそうです。ただし、両方を知っておく価値があります。

于 2008-12-19T09:31:59.937 に答える
11

ここで、逆戻りせず、一時リストなしで私のソリューション

while (listBox1.Items.Count > 0)
{
  string s = listBox1.Items[0] as string;
  // do something with s
  listBox1.Items.RemoveAt(0);
}
于 2008-12-19T10:12:12.103 に答える
1

どうですか:

foreach(var s in listBox1.Items.ToArray())
{
    MessageBox.Show(s);
    //do stuff with (s);
    listBox1.Items.Remove(s);
}

ToArray はリストのコピーを作成するため、処理中にリストが変更されることを心配する必要はありません。

于 2008-12-19T10:12:27.283 に答える
1

最後のアイテムから最初のアイテムまでコレクションを通過する必要があります。このコードはvbにあります

for i as integer= list.items.count-1 to 0 step -1
....
list.items.removeat(i)
next
于 2008-12-19T09:18:37.313 に答える
1

ジェファーソンの言うとおりです。逆方向に実行する必要があります。

同等の c# は次のとおりです。

for (var i == list.Items.Count - 1; i >= 0; i--)
{
    list.Items.RemoveAt(i);
}
于 2008-12-19T09:20:55.637 に答える
0

ForEach ブロック内で反復されているコレクションを変更することはできません。

簡単な修正は、コレクションのコピーを反復処理することです。このコピーを作成する簡単な方法は、ArrayList コンストラクターを使用することです。コピーされたコレクションの DataRowView オブジェクトは、コードと同じ基になるデータを参照し、変更できます。

For Each item As DataRowView In New System.Collections.ArrayList(lbOrdersNeedToBeVoided.Items)

http://social.msdn.microsoft.com/Forums/en-AU/vbgeneral/thread/b4d1f649-d78a-4e5b-8ad8-1940e3379bedをお読みください。

于 2013-01-11T09:54:24.133 に答える