C# 我正在使用方法调用器删除我的usercontrol,但当我使用foreach时,它的计数总是小于1

C# 我正在使用方法调用器删除我的usercontrol,但当我使用foreach时,它的计数总是小于1,c#,winforms,C#,Winforms,这是我的调用函数,我正在使用它,因为它来自另一个线程抱歉,我是新来的 private void Invoke() { try { if (this.InvokeRequired) { this.Invoke(new MethodInvoker(delegate { Invoke(); })); } else { removeUc();

这是我的调用函数,我正在使用它,因为它来自另一个线程抱歉,我是新来的

private void Invoke()
{
     try
     {
         if (this.InvokeRequired)
         {
            this.Invoke(new MethodInvoker(delegate { Invoke(); }));
         }
         else
         {
            removeUc();
         }
     }
     catch (Exception ex)
     {
        XtraMessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
}
这是我的删除函数,我的问题是,例如,我有3个usercontrol,但它只删除了2个,它总是留下一个usercontrol,我想删除所有
private void removeUc()
{
     foreach (UserControl uc in fPanel.Controls)
     {
         fPanel.Controls.Remove(uc);
     }
}
{ var forremovation=新列表(); //创建删除列表 foreach(fPanel.Controls中的用户控制uc) { 删除。添加(uc); } //从fpanel上拆下 foreach(用于删除的用户控制uc) { fPanel.控件。移除(uc); } }
这种情况(语言不可知)的一般规则是:

  • 如果已知集合是数组或类似数组的集合,即可通过索引访问,并且
    删除
    移动以下所有项的索引:

     → 然后您只需向后迭代它(使用
    for
    而不是
    foreach
    )。

  • 如果收集是可编辑的,但无法对内部数据结构进行假设:

     → 然后创建要删除的元素列表/数组,
       然后在第二个循环中删除它们(如apomene的回答)


在foreach循环中对集合元素进行迭代时,不能删除集合元素。你的removeUc方法应该会引发一个异常,你能举个例子让我看看它是如何完成的吗?
private void removeUc()
{
     var forRemoval = new List<UserControl>();
     //Create removal list
     foreach (UserControl uc in fPanel.Controls)
     {
         forRemoval.Add(uc);
     }
     //remove from fpanel
     foreach (UserControl uc in forRemoval)
     {
         fPanel.Controls.Remove(uc);
     }
}