C#:如何从IDictionary <e,icollection <t =“”>&gt;的集合中删除项目LINQ?</e,>

时间:2010-04-23 17:10:34

标签: c# linq generics collections

以下是我要做的事情:

        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?

3 个答案:

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