在运行时 C# 中从列表 <Timer> 中删除计时器
Remove a Timer from List<Timer> in runtime C#
我正在尝试从列表中删除计时器组件 -
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<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);
}
}
您不能像在 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();
我正在尝试从列表中删除计时器组件 -
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<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);
}
}
您不能像在 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();