Подтвердить что ты не робот

Как я перемещаю элементы в списке и удаляю их?

Я получаю сообщение об ошибке ниже при попытке выполнить цикл через список и затем удалить элемент.

Перечислите, что этот перечислитель связан с изменением. Перечислитель может использоваться только в том случае, если список не изменяется.

foreach (string s in listBox1.Items)
{
    MessageBox.Show(s);
    //do stuff with (s);
    listBox1.Items.Remove(s);
}

Как я могу удалить элемент и все еще пропустить содержимое?

4b9b3361

Ответ 1

Вы хотите удалить все элементы? Если да, сначала сделайте foreach, а затем просто используйте Items.Clear(), чтобы удалить все из них впоследствии.

В противном случае, возможно, обратимся назад индексом:

listBox1.BeginUpdate();
try {
  for(int i = listBox1.Items.Count - 1; i >= 0 ; i--) {
    // do with listBox1.Items[i]

    listBox1.Items.RemoveAt(i);
  }
} finally {
  listBox1.EndUpdate();
}

Ответ 2

Все остальные отправили ответ "назад", поэтому я дам альтернативу: создайте список элементов, которые вы хотите удалить, затем удалите их в конце:

List<string> removals = new List<string>();
foreach (string s in listBox1.Items)
{
    MessageBox.Show(s);
    //do stuff with (s);
    removals.Add(s);
}

foreach (string s in removals)
{
    listBox1.Items.Remove(s);
}

Иногда метод "работать назад" лучше, иногда выше - лучше, особенно если вы имеете дело с типом, который имеет метод RemoveAll(collection). Стоит знать оба.

Ответ 3

Здесь мое решение без возврата и без временного списка

while (listBox1.Items.Count > 0)
{
  string s = listBox1.Items[0] as string;
  // do something with s
  listBox1.Items.RemoveAt(0);
}

Ответ 4

Вам нужно пройти коллекцию с последнего элемента до первого. этот код находится в vb

for i as integer= list.items.count-1 to 0 step -1
....
list.items.removeat(i)
next

Ответ 5

Джефферсон прав, вам нужно сделать это назад.

Здесь эквивалент С#:

for (var i == list.Items.Count - 1; i >= 0; i--)
{
    list.Items.RemoveAt(i);
}

Ответ 6

Как насчет:

foreach(var s in listBox1.Items.ToArray())
{
    MessageBox.Show(s);
    //do stuff with (s);
    listBox1.Items.Remove(s);
}

ToArray делает копию списка, поэтому вам не нужно беспокоиться об этом, изменяя список во время его обработки.

Ответ 7

while(listbox.Items.Remove(s)) ; должен работать. Тем не менее, я думаю, что обратное решение является самым быстрым.

Ответ 8

Вы не можете внести изменения в сборку, выполняемую в блоке ForEach.

Быстрое исправление заключается в том, чтобы перебирать копию коллекции. Простым способом создания этой копии является конструктор ArrayList. Объекты DataRowView в скопированной коллекции будут ссылаться и иметь возможность изменять те же базовые данные, что и ваш код.

For Each item As DataRowView In New System.Collections.ArrayList(lbOrdersNeedToBeVoided.Items)

пожалуйста, прочитайте http://social.msdn.microsoft.com/Forums/en-AU/vbgeneral/thread/b4d1f649-d78a-4e5b-8ad8-1940e3379bed