2009-04-04 6 views
5

pourquoi je ne peux pas utiliser la boucle foreach pour déposer des éléments de ListBox:
pour chaque boucle ne fonctionne pas lors de la suppression d'éléments depuis 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); 
        } 
       } 
      } 
     }

Ce code me donne l'erreur de laisser tomber élément de listbox. D'autre part;

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

Pourquoi ne pas utiliser « boucle Foreach » au lieu de « boucle » ...

Répondre

14

Foreach répète un groupe d'instructions intégrées pour chaque élément d'un tableau ou d'une collection d'objets. L'instruction foreach est utilisé pour itérer la collection pour obtenir les informations souhaitées, mais ne doit pas être utilisé pour modifier le contenu de la collection afin d'éviter des effets secondaires imprévisibles

Source: MSDN foreach

Remarque : Souligné par

+0

Merci pour l'accent. Parfois, j'oublie pourquoi je ne devrais parfois pas utiliser foreach. – uSeRnAmEhAhAhAhAhA

2

réponse courte: Lorsque vous itérer sur une boucle en utilisant foreach, vous ne pouvez pas ajouter ou supprimer des éléments étant bouclées sur

6

Lorsque vous utilisez le foreach En boucle, vous modifiez la collection sous-jacente, interrompant ainsi l'énumérateur pour ainsi dire. Si vous souhaitez utiliser la boucle foreach, essayez ce qui suit:

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

Note: l'appel à ToArray() dans cet exemple suppose LINQ à l'objet et en fonction de la situation, vous pourriez être tenu d'appeler aussi le Cast<T>() avant l'appeler. Le point principal que j'essaie de faire passer ici est qu'en créant un tableau, foreach est maintenant en train d'itérer sur l'énumérateur du tableau au lieu de l'énumérateur de ListBox, vous permettant de modifier la collection de ListBox à volonté.

+0

Cette réponse m'a été beaucoup plus utile que la meilleure réponse. +1 –

0

Dans le premier exemple, vous supprimez des éléments de la début de la collection, ce qui affecte la collection qui définit les conditions de l'itération, alors que dans le second cas, vous supprimez des éléments de la fin de la collection à chaque fois, et les conditions initiales de la boucle ne sont pas affectées en raison de la valeur fixe de int compter.

Questions connexes