Есть коллекция
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);
}
Однако выскакивает исключение
Здравствуйте, Zirok, Вы писали:
Z>Как мне при переборе коллекции, при определенных условиях нужно удалить один из элементов, но при этом продолжить цикл
Можно создать промежуточную коллекцию ключей, которую и перебирать.
foreach (string key in new List<string>(_coll.Keys))
{
bool result = method(_coll[key]); // Здесь вызываем метод.
if (result == false)
_coll.Remove(key);
}
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, 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]);
}
}
Здравствуйте, 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; });