从运行时C#中的List <timer>中删除一个Timer

时间:2015-04-25 18:56:33

标签: 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 operation may not execute.

任何帮助?

2 个答案:

答案 0 :(得分:3)

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

尝试List<Timer> timers = new List<Timer>();

[编辑]在这个答案之后你刚刚把整个问题改成了新问题。 您无法删除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);
    }
}

答案 1 :(得分:1)

您无法像在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();