2009-04-04 6 views
5

por qué no lo uso bucle foreach para colocar elementos de cuadro de lista puede:
Cada bucle no funciona Al eliminar elementos del cuadro de lista


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); 
        } 
       } 
      } 
     }

Este códigos de error dame a caer elemento del cuadro de lista. Por otra parte;

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); 
        } 
       } 
      }

¿Por qué no puedo utilizar el "bucle foreach" en lugar de "bucle" ...

Respuesta

14

La instrucción foreach repite un grupo de instrucciones incrustadas para cada elemento de una matriz o una colección de objetos. La instrucción foreach se utiliza para iterar a través de la colección para obtener la información deseada, pero no debe utilizarse para cambiar el contenido de la colección para evitar efectos secundarios impredecibles

Fuente: MSDN foreach

Nota : el énfasis es mío

+0

Gracias por el énfasis. A veces me olvido de por qué a veces no debería usar foreach. – uSeRnAmEhAhAhAhAhA

2

respuesta corta: al iterar sobre un bucle usando foreach, no se puede añadir o eliminar elementos que forman bucles sobre

6

Cuando se utiliza el foreach loop, está modificando la colección subyacente, lo que interrumpe el enumerador por así decirlo. Si desea utilizar el bucle foreach, intente lo siguiente:

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

Nota: la llamada a ToArray() en este ejemplo se supone LINQ a objetar y dependiendo de la situación, se le puede pedir a llamar también la Cast<T>() antes llamándolo El principal punto que intento transmitir aquí es que al crear una matriz, foreach ahora itera sobre el enumerador de la matriz en lugar del enumerador de ListBox, lo que le permite modificar la colección de ListBox a voluntad.

+0

Esta respuesta fue mucho más útil para mí que la respuesta más votado. +1 –

0

En el primer ejemplo, usted está quitando elementos de la comenzar de la colección, que afecta a la colección que define las condiciones de la iteración, mientras que en el segundo caso, usted es la eliminación de los elementos de la final de la colección cada vez, y las condiciones iniciales del bucle no se ven afectadas por el valor fijo de int recuento.

Cuestiones relacionadas