[英]For Each Loop Not Working When Removing Items From ListBox
为什么我不能使用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语句为数组或对象集合中的每个元素重复一组嵌入式语句。 foreach语句用于迭代集合以获取所需信息, 但不应用于更改集合的内容以避免不可预测的副作用
资料来源:MSDN foreach
注意:强调我的
当你使用foreach循环时,你正在修改底层集合,从而可以说出中断枚举器。 如果要使用foreach循环,请尝试以下操作:
foreach (ListItem li in listbox.Items.ToArray())
{
if (li.Selected)
{
Controltest2.Remove(li.Value);
}
}
注意:在此示例中对ToArray()
的调用假定LINQ为对象,并且根据情况,您可能还需要在调用之前调用Cast<T>()
。 我试图在这里得到的主要观点是,通过创建一个数组,foreach现在迭代数组的枚举器而不是ListBox的枚举器,允许您随意修改ListBox的集合。
简短回答:使用foreach迭代循环时,无法添加或删除循环的项目
在第一个示例中,您将从集合的开头删除项目,这会影响定义迭代条件的集合,而在第二种情况下,您每次都会从集合的末尾删除项目,并且由于int count的固定值,循环初始条件不受影响。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.