我目前有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
需要保持不变
答案 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);