为简单起见;想象一下班级汽车的循环;每辆车都包含一系列汽车系统;第二个循环通过每个系统从汽车中删除它们。理想情况下,最后,每辆车都没有系统。
这是简化代码。
public class ParseCars: MonoBehaviour
{
foreach (cars a_car in cars_list)
{
// retrieve the systems for the current car
List<car_system> systems_list = a_car.ReturnSystemList();
foreach (car_system a_system in systems_list)
{
a_car.RemoveSystem(a_system);
}
Debug.Log("removed all systems for this car);
}
}
删除系统时,我所做的就是调用汽车类中包含的列表的Remove方法。
第一次删除成功;然后,当是时候删除下一个元素,而不是再次执行删除调用时,它会返回上一个foreach,在列表中加载下一个汽车。
查看下一个系统的名称;我仍然看到前一个,就好像循环不会占用列表中的下一个项目。 我没有看到任何异常,这是我第一次看到这种行为,并且无法真正弄清楚发生了什么,因为我从调试器中得不到反馈。
答案 0 :(得分:3)
您应该使用for
循环。在foreach
中,您无法在循环下更改集合。
AFAIK,foreach
使用枚举器,foreach中的迭代变量是只读的。枚举器返回对象的COPY ...这就是为什么你没有得到异常。您实际上编辑了对象的副本而不是对象本身。