1

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

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

4 回答 4

3

您的代码不起作用,因为从集合中删除项目的那一刻, Count() 减少并且 for 循环在遍历所有项目列表之前退出。

您需要首先创建要删除的元素列表(将它们放在临时列表中),然后遍历新创建的列表调用cmbTo.Items.Remove(currentElement);

于 2013-03-18T21:24:48.373 回答
3

Hint: Think about what happens to the i variable when you remove an item

...

When you RemoveAt an item, the item is removed, and every subsequent item moves up one index. Your loop then hits the bottom, where it goes back to the top, increments i, and moves on.

Result? You just skipped an item. If this is the last item in the list, then the loop exists.

Instead, manually decrement i to offset your removal, so that everything works:

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--;
    }
}
于 2013-03-18T21:27:09.543 回答
2

当您从组合框中删除一个项目时,以下项目的索引会发生变化,您的项目数也会发生变化。这可以解释你所看到的行为吗?

于 2013-03-18T21:26:40.980 回答
1

只需反方向(即从尾到前)进行移除,移除项目时您无需担心调整i1

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您目前不这样做,因此跳过了一些应该可能被删除的项目,这会导致您的问题。

于 2013-03-18T21:40:11.993 回答