从ListBox中删除项目时,每个循环不起作用

时间:2009-04-04 19:43:38

标签: c# .net asp.net

为什么我不能使用foreach循环从列表框中删除项目:

   
 protected void btnRemove_Click(object sender, EventArgs e)
        {
            ListBox listbox = Controltest2.FindControl("ListBox1") as ListBox;
            if (Controltest2.Items.Count > 0)
            {
                foreach (ListItem li in listbox.Items)
                {
                    if (li.Selected)
                    {
                        Controltest2.Remove(li.Value);
                    }
                }
            }
        }

此代码在向列表框中删除项目时出错。另一方面;

   ListBox listbox = Controltest2.FindControl("ListBox1") as ListBox;
            if (Controltest2.Items.Count > 0)
            {
                int count = Controltest2.Items.Count;
                for (int i = count - 1; i > -1; i--)
                {
                    if (listbox.Items[i].Selected)
                    {
                        Controltest2.Remove(listbox.Items[i].Value);
                    }
                }
            }

为什么我不能使用“Foreach循环”而不是“for循环”......

4 个答案:

答案 0 :(得分:14)

  

foreach语句为数组或对象集合中的每个元素重复一组嵌入式语句。 foreach语句用于迭代集合以获取所需信息,但不应用于更改集合的内容以避免不可预测的副作用

来源:MSDN foreach

注意:强调我的

答案 1 :(得分:6)

当你使用foreach循环时,你正在修改底层集合,从而可以说就是中断了枚举器。如果要使用foreach循环,请尝试以下操作:

foreach (ListItem li in listbox.Items.ToArray())
{
    if (li.Selected)
    {
        Controltest2.Remove(li.Value);
    }
}

注意:在此示例中对ToArray()的调用假定LINQ为对象,并且根据具体情况,您可能还需要在调用它之前调用Cast<T>()。我试图在这里得到的主要观点是,通过创建一个数组,foreach现在迭代数组的枚举器而不是ListBox的枚举器,允许您随意修改ListBox的集合。

答案 2 :(得分:2)

简短回答:使用foreach迭代循环时,无法添加或删除循环的项目

答案 3 :(得分:0)

在第一个示例中,您将从集合的 start 中删除项目,这会影响定义迭代条件的集合,而在第二种情况下,您将删除项目每次都来自集合的 end ,并且由于int count 的固定值,循环初始条件不受影响。