Как я перемещаю элементы в списке и удаляю их?
Я получаю сообщение об ошибке ниже при попытке выполнить цикл через список и затем удалить элемент.
Перечислите, что этот перечислитель связан с изменением. Перечислитель может использоваться только в том случае, если список не изменяется.
foreach (string s in listBox1.Items)
{
MessageBox.Show(s);
//do stuff with (s);
listBox1.Items.Remove(s);
}
Как я могу удалить элемент и все еще пропустить содержимое?
Ответы
Ответ 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