尝试循环浏览列表框然后删除项目时,我收到以下错误。
此枚举器绑定的列表已被修改。只有在列表没有更改时才能使用枚举器。
foreach (string s in listBox1.Items)
{
MessageBox.Show(s);
//do stuff with (s);
listBox1.Items.Remove(s);
}
如何删除项目并仍然遍历内容?
答案 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