从列表中删除计时器<;定时器>;运行时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-为什么不将其作为答案发布?