[已解决问题] 一小段代码
提问时间: 2008-04-17 09:28
悬赏分:20 浏览:268 次
foreach(ListViewItem m_item in listView1.Items)
{
    if(m_item.Selected||m_item.Checked)
    {
         listView1.Items[i].RemoveAt(m_item.Index);
    }
}

在winform中,这段代码为什么会出错呢?

提问者:JustDI - 初学一级
最佳答案
因为你的集合在遍历过程中发生了变化了。
一个集合在遍历时是不允许同步发生列表改变的。
2008/4/17 10:02:08 回答者:阿不


提问者对于答案的评价:差点忘记自己的这个提问.谢谢阿不的回答,现在明白了. deerchao 的答案也是正确的,我昨天也是用 for (int i = lvPersonal.Items.Count-1; i >=0; i--) { if (lvPersonal.Items[i].Selected || lvPersonal.Items[i].Checked) { lvPersonal.Items.RemoveAt(lvPersonal.Items[i].Index); } } 这个方法解决的.
其它回答(2)
foreach(int i=0; i<listView1.Items.Count; i++)
{
  ListViewItem m_item = listView1.Items[i];
    if(m_item.Selected||m_item.Checked)
    {
     listView1.Items.RemoveAt(i);
    i--;
    }
}
2个月前   回答者:deerchao - 大侠五级
《C#语言规范》
8.8.4 foreach 语句
在 foreach 语句执行期间,迭代变量表示当前正在为其执行迭代的集合元素。如果嵌入语句试图修改迭代变量(通过赋值或 ++ 和 -- 运算符)或将迭代变量作为 ref 或 out 参数传递,则将发生编译时错误。

《规范》给出了foreach的背后扩展形式

E enumerator = (collection).GetEnumerator();

try {

   while (enumerator.MoveNext()) {

       ElementType element = (ElementType)enumerator.Current;

       statement;

   }

}

finally {

   IDisposable disposable = enumerator as System.IDisposable;

   if (disposable != null) disposable.Dispose();

}

并说,enumerator 变量是一个临时变量,它在嵌入 statement 中既是不可访问的,也是不可见的,元素变量在嵌入 statement 中是只读的。

如果要进一步探究,请先了解迭代模式。

2个月前   回答者:杨连国 - 菜鸟二级
评论
   您需要登录以后才能回答!
我的问题    我要提问


快到期问题

> 问题排行榜

有不合适内容,建议去除