如何遍历列表框中的项目然后删除这些项目?

时间:2008-12-19 09:12:58

标签: c# listbox

尝试循环浏览列表框然后删除项目时,我收到以下错误。

  

此枚举器绑定的列表已被修改。只有在列表没有更改时才能使用枚举器。

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

如何删除项目并仍然遍历内容?

8 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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)方法的类型。值得一提的是。

答案 2 :(得分:11)

这里我的解决方案没有后退且没有临时列表

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

答案 3 :(得分:1)

您必须完成从最后一项到第一项的集合。此代码在vb中

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

答案 4 :(得分:1)

杰斐逊是对的,你必须向后做。

这是c#等价物:

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

答案 5 :(得分:1)

怎么样:

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

ToArray会复制列表,因此您无需担心在处理列表时更改列表。

答案 6 :(得分:1)

while(listbox.Items.Remove(s)) ;也应该有效。但是,我认为向后解决方案是最快

答案 7 :(得分: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