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);
我目前有 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);