【问题标题】:c# Multiple Timers Editing the same Listc# 多个计时器编辑同一个列表
【发布时间】:2017-02-24 14:00:42
【问题描述】:

我目前有 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 用于同时添加Cars,这会给出Exception

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

【问题讨论】:

  • 用for循环代替foreach
  • 您不能在迭代集合时对其进行修改。

标签: c# winforms list self-modifying


【解决方案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&lt;Auto&gt;,您还可以使用以下内容:

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

您也可以使用向后的 for 循环,但我不建议这样做,因为它很难理解。这也仅适用于您的收藏是List&lt;Auto&gt;

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

【讨论】:

  • 只是删除你的循环语句,没有明白你的意思,否则我不明白为什么有人标记了这个。
【解决方案2】:

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

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

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

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

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

【讨论】:

【解决方案3】:
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);
    }
}

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • RemoveAll 是一个很棒且简单的方法,但它与 Linq 无关。但是 RemoveAll 和 Linq 都处理 Lambdas。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多