我正在尝试从组合框中删除更多项目,但应用程序一次只删除一个项目。
combobox
有一个电子邮件地址列表。我想删除空项("")
以及文本中没有@
的项目。
下面的代码一次只删除一个项目。
for (int i = 0; i < cmbTo.Items.Count; i++)
{
string st = cmbTo.Items[i].ToString();
if (st == "" || st.IndexOf("@") == -1)
{
cmbTo.Items.RemoveAt(i);
}
}
我该如何重写?
答案 0 :(得分:4)
您的代码不起作用,因为从集合中删除项目的那一刻,Count()会减少,而for循环会在遍历所有项目列表之前退出。
您需要首先创建要删除的元素列表(将它们放在临时列表中),然后遍历新创建的列表,调用cmbTo.Items.Remove(currentElement);
答案 1 :(得分:3)
提示:考虑删除项目时i
变量会发生什么
...
当您删除某个项目时,该项目将被删除,并且每个后续项目都会向上移动一个索引。然后你的循环击中底部,返回顶部,递增i
,然后继续前进。
结果?你刚跳过一个项目。如果这是列表中的最后一项,则循环存在。
相反,手动递减i
以抵消删除,以便一切正常:
for (int i = 0; i < cmbTo.Items.Count; i++)
{
string st = cmbTo.Items[i].ToString();
if (st == "" || st.IndexOf("@") == -1)
{
cmbTo.Items.RemoveAt(i);
i--;
}
}
答案 2 :(得分:2)
从组合框中删除项目时,以下项目的索引会发生变化,您的项目计数也会发生变化。这可以说明你所看到的行为吗?
答案 3 :(得分:1)
只需在相反方向(即从头到尾)进行移除,并且在移除项目时无需担心调整i
1 :
var items = cmbTo.Items;
int i = items.Count;
while (i > 0) {
--i;
string st = items[i].ToString();
if (st == "" || st.IndexOf("@") < 0)
items.RemoveAt(i);
}
1 您当前没有这样做,因此会跳过一些可能被删除的项目,这会导致您的问题。