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

C# 如何从组合框中删除更多项目?,c#,string,combobox,C#,String,Combobox,我试图从组合框中删除更多项,但应用程序一次只删除一项 组合框中有一个电子邮件地址列表。我想删除空项目(“”),以及文本中没有@的项目 下面的代码一次只删除一项 for (int i = 0; i < cmbTo.Items.Count; i++) { string st = cmbTo.Items[i].ToString(); if (st == "" || st.IndexOf("@") == -1) {

我试图从组合框中删除更多项,但应用程序一次只删除一项

组合框中有一个电子邮件地址列表。我想删除空项目
(“”)
,以及文本中没有
@
的项目

下面的代码一次只删除一项

    for (int i = 0; i < cmbTo.Items.Count; i++)
    {
        string st = cmbTo.Items[i].ToString();
        if (st == "" || st.IndexOf("@") == -1)
        {               
            cmbTo.Items.RemoveAt(i);                    
        }
    }
for(int i=0;i

如何重写此内容?

您的代码无法工作,因为从集合中删除项时,Count()会减少,并且for循环会在遍历所有项列表之前退出


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

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


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

从组合框中删除项目时,以下项目的索引将更改,项目计数也将更改。这能解释你看到的行为吗?

当你从组合框中删除一个项目时,下列项目的索引会改变,项目数量也会改变。这能解释您看到的行为吗?

提示:考虑删除项目时
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--;
    }
}
for(int i=0;i
提示:考虑删除项目时
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--;
    }
}
for(int i=0;i
只需按相反方向(即从末端到前部)进行拆卸,您就不必担心在拆卸物品时调整
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);
}
var items=cmbTo.items;
int i=项目数;
而(i>0){
--一,;
字符串st=items[i].ToString();
if(st==“”| | st.IndexOf(“@”)<0)
项目.删除(i);
}


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);
}
var items=cmbTo.items;
int i=项目数;
而(i>0){
--一,;
字符串st=items[i].ToString();
if(st==“”| | st.IndexOf(“@”)<0)
项目.删除(i);
}


1您当前没有这样做,因此跳过了一些可能要删除的项目,这会导致您的问题。

和@(没有)。
没有什么…?看看像这样简单的
cmbTo.items.AddRange(all.Where(x=>x!=string.Empty).ToArray()如何一些。name@gmail.com有。。。。some.mailgmail.com没有@您现有的解决方案有什么问题吗?删除您正在迭代的集合中的项目时要小心。
正在检查
Count
属性,该属性会发生变化,因为
移除了
和@(没有)。
没有什么…?看看像这样简单的
cmbTo.Items.AddRange(all.Where(x=>x!=string.Empty).ToArray()如何一些。name@gmail.com有。。。。some.mailgmail.com没有@您现有的解决方案有什么问题吗?删除您正在迭代的集合中的项目时要小心。
for
正在检查
Count
属性,该属性因
RemoveAt
没有设置器而变化,因此,您将无法将临时列表分配回组合框。@BrankoDimitrijevic我不是说他应该将项目设置为临时列表,而是在临时列表中循环并调用
cmbTo.Remove(currentItemInTempList)
。好的,但是在这种情况下,您如何表示“不包含@的项目”?在这种情况下,
currentItemInTempList
会是什么?不幸的是,没有设置程序,因此您将无法将临时列表分配回组合框。@BrankoDimitrijevic我不是说他应该将项目设置到临时列表,而是通过临时列表循环调用
cmbTo.Remove(currentItemInTempList)
。好的,但在这种情况下,如何表示“不包含@的项”?