Вы хотите удалить все объекты? Если так, сделайте 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();
}
Здесь мое решение, не идя назад и без временного списка
while (listBox1.Items.Count > 0)
{
string s = listBox1.Items[0] as string;
// do something with s
listBox1.Items.RemoveAt(0);
}
Все остальные отправили "движение назад" ответ, таким образом, я дам альтернативу: создайте список объектов, которые Вы хотите удалить, затем удалить их в конце:
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)
метод. Стоящий знания обоих все же.
Необходимо пройти набор от последнего объекта до первого. этот код находится в vb
for i as integer= list.items.count-1 to 0 step -1
....
list.items.removeat(i)
next
Jefferson прав, необходимо сделать это назад.
Вот c# эквивалент:
for (var i == list.Items.Count - 1; i >= 0; i--)
{
list.Items.RemoveAt(i);
}
Как насчет:
foreach(var s in listBox1.Items.ToArray())
{
MessageBox.Show(s);
//do stuff with (s);
listBox1.Items.Remove(s);
}
ToArray делает копию списка, таким образом, Вы не должны волноваться об этом изменяющий список при обработке его.