当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何遍历列表框中的项目然后删除这些项目?》经验,为你挑选了3个好方法。

我在尝试循环列表框然后删除项目时收到以下错误.

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

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

如何删除项目并仍然循环浏览内容?



1> Marc Gravell..:

要删除所有商品吗?如果是这样,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();
}



2> Jon Skeet..:

其他人都发布了"向后退"的答案,所以我会提供替代方案:创建一个要删除的项目列表,然后在最后删除它们:

List removals = new List();
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)方法的类型.值得一提的是.


如果是这种情况,那么问题中示例代码中的foreach循环就已经爆炸了.我正在做出与问题相同的假设,我认为这是非常合理的.
-1.listBox1.Items可能包含除string之外的对象,在这种情况下将抛出InvalidCastException.

3> nruessmann..:

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

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

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有