C #: Как удалить элементы из коллекции IDictionary <E, ICollection <T>> с помощью LINQ? - PullRequest
3 голосов
/ 23 апреля 2010

Вот что я пытаюсь сделать:

        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 ]

5 голосов
/ 23 апреля 2010

Используйте ToList, чтобы создать независимый список для перечисления элементов, которые необходимо удалить.

    foreach (ICollection<IGameObjectController> layerSet in layers.Values)
    {
        foreach (IGameObjectController controller in layerSet
                   .Where(c => c.Model.DefinedInVariant).ToList())
        {
            layerSet.Remove(controller);

        }
    }
4 голосов
/ 23 апреля 2010

Сначала вы можете создать отдельный список объектов, которые необходимо удалить, а затем удалить их в отдельном цикле.

Во-вторых, если ваша коллекция поддерживает индексирование, просто выполните цикл for вниз от Count-1 до 0 и используйте RemoveAt. * ​​1004 *

3 голосов
/ 23 апреля 2010
    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);
        }
    }
...