2009-04-04 6 views
5

warum Entfernen kann ich Elemente aus listbox nicht verwenden foreach-Schleife löschen:
für jede Schleife funktioniert nicht, wenn Elemente aus 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); 
        } 
       } 
      } 
     }

Diese Codes geben Sie mir Fehler Artikel von listbox fallen zu lassen. Andererseits;

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

Warum kann ich "Foreach loop" anstelle von "for-Schleife" verwenden ...

Antwort

14

Die foreach Anweisung wiederholt eine Gruppe von eingebetteten Anweisungen für jedes Element in einem Array oder eine Objektsammlung. Die foreach-Anweisung wird durch die Sammlung iterieren die gewünschten Informationen zu erhalten, aber nicht verwendet werden soll, um den Inhalt der Sammlung zu ändern unvorhersehbare Nebenwirkungen

Quelle zu vermeiden: MSDN foreach

Hinweis : Hervorhebung von mir

+0

Danke für die Betonung. Manchmal vergesse ich, warum ich foreach manchmal nicht benutzen sollte. – uSeRnAmEhAhAhAhAhA

2

Kurze Antwort: Wenn Sie über eine Schleife mit foreach iterieren, können Sie keine Elemente hinzufügen oder entfernen über

6

wird geschleift Wenn Sie die foreach verwenden Schleife, Sie ändern die zugrundeliegende Auflistung und unterbrechen so den Enumerator. Wenn Sie die foreach-Schleife verwenden möchten, gehen Sie folgendermaßen vor:

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

Hinweis: der Aufruf an ToArray() in diesem Beispiel LINQ und in Abhängigkeit von der Situation zum Objekt einnimmt, müssen Sie möglicherweise auch die nennen Cast<T>() vor es anruft. Der Hauptpunkt, den ich hier vermitteln möchte, ist, dass beim Erstellen eines Arrays der Foreach jetzt über den Enumerator des Arrays statt über den Enumerator der ListBox iteriert, so dass Sie die Auflistung der ListBox nach Belieben ändern können.

+0

Diese Antwort war mir viel hilfreicher als die Antwort mit der höchsten Wahl. +1 –

0

Im ersten Beispiel sind Sie Elemente aus dem starten der Sammlung zu entfernen, die die Sammlung betrifft, die die Bedingungen der Iteration definiert, während im zweiten Fall sind Sie Elemente aus dem Ende zu entfernen der Sammlung jedes Mal, und die Schleifenanfangsbedingungen sind wegen des festen Werts von int count nicht betroffen.