如何循环浏览列表框中的项目,然后删除这些项目?
当我尝试循环一个列表框,然后删除该项目时,我得到下面的错误。
这个枚举器绑定的列表已被修改。 枚举器只能在列表不变的情况下使用。
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
- Windows上的TensorFlow版本1.0.0-rc2:“OpKernel('op:”BestSplits“device_type:”CPU“')for unknown op:BestSplits”with test code
- 运行rmi服务器,classnotfound