Удаление в цикле из коллекции
От: Zirok  
Дата: 12.09.07 15:40
Оценка:
Есть коллекция
Dictionary<string, objects> _coll = new Dictionary<string, object>();


Как мне при переборе коллекции, при определенных условиях нужно удалить один из элементов, но при этом продолжить цикл, что то вроде вот этого:

foreach (KeyValuePair<string, object> item in _coll)
{
    string key = item.Key;

    bool result = method(item.Value); // Здесь вызываем метод.
    if (result == false)
    _coll.Remove(key);
}

Однако выскакивает исключение
Удаление в цикле из коллекции
От: nikov США http://www.linkedin.com/in/nikov
Дата: 12.09.07 16:01
Оценка: 1 (1)
#Имя: FAQ.dotnet.collection.remove
Здравствуйте, Zirok, Вы писали:

Z>Как мне при переборе коллекции, при определенных условиях нужно удалить один из элементов, но при этом продолжить цикл


Можно создать промежуточную коллекцию ключей, которую и перебирать.

        foreach (string key in new List<string>(_coll.Keys))
        {
            bool result = method(_coll[key]); // Здесь вызываем метод.
            if (result == false)
                _coll.Remove(key);
        }
Re: Удаление в цикле из коллекции
От: TK Лес кывт.рф
Дата: 12.09.07 16:02
Оценка: +1
Здравствуйте, Zirok, Вы писали:

Z>Как мне при переборе коллекции, при определенных условиях нужно удалить один из элементов, но при этом продолжить цикл, что то вроде вот этого:


Стандартная Dictionary такого не поддерживает. Можно получить список ключей, склонировать его и идти по нему. Либо, запоминать ключи необходимые для удаления и удалять их после прохода по коллекции
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Удаление в цикле из коллекции
От: Saruwatari Россия  
Дата: 12.09.07 16:08
Оценка: 1 (1)
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Zirok, Вы писали:


Z>>Как мне при переборе коллекции, при определенных условиях нужно удалить один из элементов, но при этом продолжить цикл


N>Можно создать промежуточную коллекцию ключей, которую и перебирать.


N>
N>        foreach (string key in new List<string>(_coll.Keys))
N>        {
N>            bool result = method(_coll[key]); // Здесь вызываем метод.
N>            if (result == false)
N>                _coll.Remove(key);
N>        }

N>


Так же, если нужно удалять в цикле из коллекции типа List<int>, например, то нужно следовать в обратном порядке. Тогда будет все ОК. Вот так:
List<int> list = new List<int>;
...
for (int i = list.Count - 1; i >= 0; i--)
{
   if (list[i] == 0)
   {
      list.Remove(list[i]);
   }
}
Re[3]: Удаление в цикле из коллекции
От: Lloyd Россия  
Дата: 12.09.07 16:19
Оценка: 4 (3)
Здравствуйте, Saruwatari, Вы писали:

S>Так же, если нужно удалять в цикле из коллекции типа List<int>, например, то нужно следовать в обратном порядке. Тогда будет все ОК. Вот так:

S>
S>List<int> list = new List<int>;
S>...
S>for (int i = list.Count - 1; i >= 0; i--)
S>{
S>   if (list[i] == 0)
S>   {
S>      list.Remove(list[i]);
S>   }
S>}
S>


Для удаления из листа лучше использовать RemoveAll:
list.RemoveAll(delegate (int i) { return i == 0; });
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.