2009-04-04 3 views
5

почему не я использовать цикл Еогеасп падение элементов из выпадающего списка можно:
для каждого цикла не работает При Удаление элементов из ListBox


protected void btnRemove_Click(object sender, EventArgs e) 
     { 
      ListBox listbox = Controltest2.FindControl("ListBox1") as ListBox; 
      if (Controltest2.Items.Count > 0) 
      { 
       foreach (ListItem li in listbox.Items) 
       { 
        if (li.Selected) 
        { 
         Controltest2.Remove(li.Value); 
        } 
       } 
      } 
     }

Этот код дает мне ошибку падение пункт из списка. С другой стороны;

ListBox listbox = Controltest2.FindControl("ListBox1") as ListBox; 
      if (Controltest2.Items.Count > 0) 
      { 
       int count = Controltest2.Items.Count; 
       for (int i = count - 1; i > -1; i--) 
       { 
        if (listbox.Items[i].Selected) 
        { 
         Controltest2.Remove(listbox.Items[i].Value); 
        } 
       } 
      }

Почему я не могу использовать «Foreach цикл» вместо «цикл» ...

ответ

14

Еогеасп оператор повторяет группу вложенных заявлений для каждого элемента массива или коллекции объектов. Оператор Еогеаспа используется для итерации по коллекции, чтобы получить нужную информацию, , но не должен быть использован для изменения содержимого коллекции, чтобы избежать непредсказуемых побочных эффектов

Источник: MSDN foreach

Примечания : курсив мой

+0

Спасибо за внимание. Иногда я забываю, почему я иногда не должен использовать foreach. – uSeRnAmEhAhAhAhAhA

2

Короткий ответ: Когда вы итерации цикла с помощью Еогеасп, вы не можете добавлять или удалять элементы, которые накинут

6

При использовании Еогеасп loop, вы изменяете базовую коллекцию, тем самым перебирая перечислитель, так сказать. Если вы хотите использовать цикл Еогеаспа, попробуйте следующее:

foreach (ListItem li in listbox.Items.ToArray()) 
{ 
    if (li.Selected) 
    { 
     Controltest2.Remove(li.Value); 
    } 
} 

Примечание: вызов ToArray() в этом примере предполагается, LINQ к объекту и в зависимости от ситуации, вам может потребоваться также вызвать Cast<T>() до называя это. Главное, что я пытаюсь понять здесь, состоит в том, что, создав массив, foreach теперь выполняет итерацию по перечислителю массива вместо перечислителя ListBox, позволяя вам изменять коллекцию ListBox по своему усмотрению.

+0

Этот ответ был гораздо полезнее для меня, чем главный проголосовавший ответ. +1 –

0

В первом примере, вы удаляете элементы из начинает коллекций, которая влияет на коллекцию, которая определяет условия итерации, тогда как во втором случае, вы удаляете элементы из конца коллекции, и начальные условия цикла не влияют из-за фиксированного значения int count.

Смежные вопросы