从列表中删除计时器<;定时器>;运行时C#

从列表中删除计时器<;定时器>;运行时C#,c#,arrays,controls,C#,Arrays,Controls,我正在尝试从列表中删除计时器组件- foreach (Timer timer in timers) { if (timer.Tag.ToString()=="mytag") { timer.Enabled = false; timer.Tick -= OnTimerTick; timers.Remove(timer); } } 但这会产生错误- Collection was modified; enumeration o

我正在尝试从列表中删除计时器组件-

foreach (Timer timer in timers)
{
    if (timer.Tag.ToString()=="mytag")
    {
        timer.Enabled = false;

        timer.Tick -= OnTimerTick;
        timers.Remove(timer);
    }
}
但这会产生错误-

Collection was modified; enumeration operation may not execute.

有什么帮助吗?

对于未知大小,您应该使用列表而不是数组

尝试
List timers=newlist()

[编辑]在回答这个问题之后,您刚刚将整个问题更改为一个新问题。 无法删除foreach循环中的项。您可以使用该列表的副本,也可以简单地向后迭代:

for (int i = timers.Count - 1; i >= 0; i--)
{
    if (timers[i].Tag.ToString()=="mytag")
    {
        timers[i].Enabled = false;
        timers[i].Tick -= OnTimerTick;
        timers.RemoveAt(i);
    }
}

对于未知大小,应使用列表而不是数组

尝试
List timers=newlist()

[编辑]在回答这个问题之后,您刚刚将整个问题更改为一个新问题。 无法删除foreach循环中的项。您可以使用该列表的副本,也可以简单地向后迭代:

for (int i = timers.Count - 1; i >= 0; i--)
{
    if (timers[i].Tag.ToString()=="mytag")
    {
        timers[i].Enabled = false;
        timers[i].Tick -= OnTimerTick;
        timers.RemoveAt(i);
    }
}

您不能像在C#中那样修改
foreach
中的集合。您可以通过更改以下内容来解决此问题:

 foreach (Timer timer in timers)
    {
        if (timer.Tag.ToString()=="mytag")
        {
            timer.Enabled = false;

            timer.Tick -= OnTimerTick;
            timers.Remove(timer);
        }
    }
对此,请改为:

var timersToRemove = new List<Timer>();
foreach (Timer timer in timers)
    {
        if (timer.Tag.ToString()=="mytag")
        {
            timer.Enabled = false;

            timer.Tick -= OnTimerTick;
            timersToRemove.Add(timer);
        }
    }

foreach(var timer in timersToRemove)
   timers.Remove(timer);
// Clear the list
timersToRemove.Clear();
var timersToRemove=new List();
foreach(计时器中的计时器)
{
if(timer.Tag.ToString()=“mytag”)
{
timer.Enabled=false;
timer.Tick-=OnTimerTick;
timersToRemove.Add(计时器);
}
}
foreach(timersToRemove中的var定时器)
定时器。移除(定时器);
//清除列表
timersToRemove.Clear();

您不能像在C#中那样修改
foreach
中的集合。您可以通过更改以下内容来解决此问题:

 foreach (Timer timer in timers)
    {
        if (timer.Tag.ToString()=="mytag")
        {
            timer.Enabled = false;

            timer.Tick -= OnTimerTick;
            timers.Remove(timer);
        }
    }
对此,请改为:

var timersToRemove = new List<Timer>();
foreach (Timer timer in timers)
    {
        if (timer.Tag.ToString()=="mytag")
        {
            timer.Enabled = false;

            timer.Tick -= OnTimerTick;
            timersToRemove.Add(timer);
        }
    }

foreach(var timer in timersToRemove)
   timers.Remove(timer);
// Clear the list
timersToRemove.Clear();
var timersToRemove=new List();
foreach(计时器中的计时器)
{
if(timer.Tag.ToString()=“mytag”)
{
timer.Enabled=false;
timer.Tick-=OnTimerTick;
timersToRemove.Add(计时器);
}
}
foreach(timersToRemove中的var定时器)
定时器。移除(定时器);
//清除列表
timersToRemove.Clear();

为什么不使用
列表
?@dotnetom-好主意。让我们试试。为什么不使用
List
?@dotnetom-好主意。让我们试试。集合已修改;枚举操作可能无法执行。@s.k.paul使用
foreach
对列表进行迭代时,不能修改列表。如果在循环中需要删除或添加某些内容,请创建一个临时列表来添加需要销毁的项目,然后在循环外根据该列表销毁这些项目。@VaughanHilts-请发布一个示例代码好吗?@s.k.paul在注释中并不容易--这是另一个问题,但要点是:
foreach(计时器中的var timer){timersToRemove.Add(timer);}
然后在循环外执行
foreach(timersToRemove中的var timer){timers.remove(timer);}
@VaughanHilts-为什么不将其作为答案发布?集合已修改;枚举操作可能无法执行。@s.k.paul使用
foreach
对列表进行迭代时,不能修改列表。如果在循环中需要删除或添加某些内容,请创建一个临时列表以添加需要销毁的项目,然后在循环外部销毁该项目m基于该列表。@VaughanHilts-请您发布一个示例代码好吗?@s.k.paul评论起来并不容易——这是另一个问题,但要点是:
foreach(计时器中的var timer){timersToRemove.Add(timer);}
然后在循环外执行
foreach(计时器中的var timer){timers.remove(timer);}
@VaughanHilts-为什么不将其作为答案发布?