如何循环浏览列表框中的项目,然后删除这些项目?

当我尝试循环一个列表框,然后删除该项目时,我得到下面的错误。

这个枚举器绑定的列表已被修改。 枚举器只能在列表不变的情况下使用。

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

我怎样才能删除项目,并仍然通过内容循环?

你想删除所有项目? 如果是这样,先做foreach ,然后使用Items.Clear()将其全部删除。

否则,可能由indexer向后循环:

 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(); } 

其他人都发布了“向后退”的答案,所以我会给出替代scheme:创build要删除的项目列表,然后在最后删除它们:

 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)方法的types时。 不过值得了解。

在这里,我的解决scheme没有倒退,没有临时名单

 while (listBox1.Items.Count > 0) { string s = listBox1.Items[0] as string; // do something with s listBox1.Items.RemoveAt(0); } 

你必须通过收集从最后一个项目到第一个。 这个代码是在VB中

 for i as integer= list.items.count-1 to 0 step -1 .... list.items.removeat(i) next 

杰斐逊是对的,你必须倒退。

这是C#的等价物:

 for (var i == list.Items.Count - 1; i >= 0; i--) { list.Items.RemoveAt(i); } 

怎么样:

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

ToArray创build了一个列表的副本,所以在处理它时不需要担心它会改变列表。

while(listbox.Items.Remove(s)) ; 也应该工作。 不过,我认为倒退解决scheme是最快的

您无法修改正在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