如何从组合框中删除更多项目?

时间:2013-03-18 21:18:22

标签: c# string combobox

我正在尝试从组合框中删除更多项目,但应用程序一次只删除一个项目。

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);                    
        }
    }

我该如何重写?

4 个答案:

答案 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 您当前没有这样做,因此会跳过一些可能被删除的项目,这会导致您的问题。