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

时间:2017-02-24 14:00:43

标签: c# winforms list self-modifying

我目前有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离开控制时,由于Exception被用于同时添加List,因此会发出Car

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

4 个答案:

答案 0 :(得分:1)

迭代时无法修改集合。您必须存储要删除的汽车,然后将其从原始列表中删除。

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);

如果autoliste是List<Auto>,您还可以使用以下内容:

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

您也可以使用向后循环,但我不建议这样做,因为它很难理解。这仅适用于您的收藏集是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);
    }
}

答案 1 :(得分:0)

您无法在迭代时修改集合。列表的实现使得它在其中保留私有版本号,并且您所做的每个更改(如调用Remove()方法)都会增加内容版本号。

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

如果你想根据标准清除项目,那么你必须从第一个中构建新的列表,然后不包含不需要的元素:

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

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

答案 2 :(得分:0)

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);
    }
}

答案 3 :(得分:0)

您可以使用RemoveAll()功能删除汽车:

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