以下是我要做的事情:
private readonly IDictionary<float, ICollection<IGameObjectController>> layers;
foreach (ICollection<IGameObjectController> layerSet in layers.Values)
{
foreach (IGameObjectController controller in layerSet)
{
if (controller.Model.DefinedInVariant)
{
layerSet.Remove(controller);
}
}
}
当然,这不起作用,因为它会导致并发修改异常。 (在某些迭代器上是否有相当于Java的安全删除操作?)如何正确地执行此操作,或使用LINQ?
答案 0 :(得分:5)
使用ToList
创建一个独立的列表,用于枚举要删除的项目。
foreach (ICollection<IGameObjectController> layerSet in layers.Values)
{
foreach (IGameObjectController controller in layerSet
.Where(c => c.Model.DefinedInVariant).ToList())
{
layerSet.Remove(controller);
}
}
答案 1 :(得分:4)
首先,您可以创建一个单独的需要删除的对象列表,然后在单独的循环中删除它们。
其次,如果您的集合支持索引,只需从Count-1向下执行for
循环到0,并使用RemoveAt。
答案 2 :(得分:3)
private readonly IDictionary<float, ICollection<IGameObjectController>> layers;
foreach (ICollection<IGameObjectController> layerSet in layers.Values)
{
List<IGameObjectController> toDelete = layerSet.Where(ls => ls.Model.DefinedInVariant).ToList();
foreach (IGameObjectController controller in toDelete)
{
layerSet.Remove(controller);
}
}