c# 多个计时器编辑同一个列表

c# Multiple Timers Editing the same List

我目前有 4 个定时器向 List 添加对象,但一旦它们离开 WinForms 控件,就应该将其删除。

我试过这个:

foreach (Auto a in autoListe)
{
    if (a.X > 550 || a.X < -50 || a.Y > 550 || a.Y < -50)
    {
        autoListe.Remove(a);
    }
}

但是,当 Object 离开控件时,由于 List 被用于同时添加 Car,因此会给出 Exception

所以现在我不确定如何删除 Object,因为 Object 的添加需要保持不变

您不能在遍历集合时修改它。列表的实现是这样的,它在其中保留私有版本号,并且您所做的每一次更改,如调用 Remove() 方法都会增加内容版本号。

移动到下一个元素(由 foreach 循环完成)检查版本号是否与创建枚举器时相同。如果不是,则抛出异常。

如果您想根据条件清除项目,则必须从第一个列表构建新列表,这样就不会包含不需要的元素:

autoListe = 
    autoListe
        .Where(a => !(a.X > 550 || a.X < -50 || a.Y > 550 || a.Y < -50))
        .ToList();

你也可以在不构造枚举器的循环中使用列表的RemoveAt()方法,但那比这复杂得多。

您不能在迭代时修改 collection。您必须存储要删除的汽车,然后将它们从原始列表中删除。

var autosDieGeloeschtWerdenSollen = new List<Auto>();
foreach (Auto a in autoListe)
{
    if (a.X > 550 || a.X < -50 || a.Y > 550 || a.Y < -50)
    {
        autosDieGeloeschtWerdenSollen.Add(a);
    }
}
autoListe.RemoveRange(autosDieGeloeschtWerdenSollen);

如果自动列表是 List<Auto> 您还可以使用以下内容:

autoListe.RemoveAll(a => a.X > 550 || a.X < -50 || a.Y > 550 || a.Y < -50);

您也可以倒着使用 for-loop,但我不建议这样做,因为它很难理解。这也仅在您的 Collection 是 List<Auto>.

时有效
for (int i = autoListe.Count - 1; i >= 0; i--)
{
    var a = autoListe[i];

    if (a.X > 550 || a.X < -50 || a.Y > 550 || a.Y < -50)
    {
      autoListe.RemoveAt(i);
    }
}
autoListe.RemoveAll(a => a.X > 550 || a.X < -50 || a.Y > 550 || a.Y < -50);

for (int i = autoListe.Count - 1; i >= 0; i--)
{
    var a = autoListe[i];

    if (a.X > 550 || a.X < -50 || a.Y > 550 || a.Y < -50)
    {
      autoListe.RemoveAt(i);
    }
}

您可以使用RemoveAll()函数删除汽车:

autoListe.RemoveAll(x => x.Auto > 550 || x.Auto < -50 || x.Auto > 550 || x.Auto < -50);