Wie kann ich foreach Verfahren statt für Verfahren mit Entfernen Methode des Listenfeldes verwenden?

StackOverflow https://stackoverflow.com/questions/720625

  •  23-08-2019
  •  | 
  •  

Frage

Wie kann ich zweiten Methode anstelle von ersten

erstes (Webbenutzersteuerelement)

   public void Remove()
        {

            int count = this.ListBox1.Items.Count;

            for (int i = count - 1; i > -1; i--)
            {
                if (ListBox1.Items[i].Selected)
                {
                    ListBox1.Items.Remove(ListBox1.Items[i]);
                }
            }
        }

Test.aspx (Test der ersten)

  protected void btnRemove_Click(object sender, EventArgs e)
        {
            ItemOrderer2.Remove();

        }

Sekunde (Web-Benutzerkontrolle)

 public void Remove(string value)
        {
            ListItem li = new ListItem();
            li = ListBox1.Items.FindByValue(value);
            if (li != null)
            {
                this.ListBox1.Items.Remove(li);
            }

Test.aspx (Test der Sekunde)

  protected void btnRemove_Click(object sender, EventArgs e)
        {
           // ItemOrderer2.Remove();
            if (ItemOrderer2.Items.Count > 0)
                foreach (ListItem li in ItemOrderer2.Items)
                {
                    if (li.Selected)
                    {
                        ItemOrderer2.Remove(li.Value);
                    }
                }
        }
War es hilfreich?

Lösung

Sie können nicht verwenden foreach, wenn Sie Daten in dem foreach entfernen - es (absichtlich) bricht den Iterator

.

Wenn for funktioniert, warum es ändern? Wenn Sie verzweifelt verwenden foreach, dann baut eine getrennt Liste zuerst - zum Beispiel:

List<ListItem> remove = new List<ListItem>();
foreach(ListItem li in ItemOrdere2.Items) {
    if(li.Selected) remove.Add(li);
}
foreach(ListItem li in remove) {
    ItemOrderer2.Remove(li); // or similar
}

Die erste Abfrage oftmals von LINQ vereinfacht werden, wenn, wenn zur Verfügung.

Andere Tipps

Sie können die Werte erhalten zunächst eine Liste entfernt werden und sie dann durch die Funktion remove laufen. Dies kann weiter verbessert werden, wenn nötig.

var removedValues = ItemOrderer2.Items
                    .Where(li => li.Selected)
                    .Select(li => li.Value).ToList();

foreach (var removedValue in removedValues) {
   ItemOrderer2.Remove(removedValue);
}

Sie können eine Sammlung ändern Sie in einer foreach-Schleife iterieren.

aber sagen, dass es scheint, dass Sie versuchen, die ausgewählten Elemente aus einem ListBox zu entfernen. Man könnte auch so etwas wie verwenden:

while(ItemOrderer2.SelectedItem != null)
{
    ItemOrderer2.Items.Remove(ItemOrderer2.SelectedItem);
}

Nun, Sie können keine Änderungen vornehmen in einem IList <> mit foreach, einfach weil es die Anzahl der Elemente in ihr ändern würde.

Auch die erste Methode, die Sie zeigen sind fehlerhaft, da zählt als 20 beginnen könnte, aber wenn Sie 10 Teile mit dem Verfahren entfernen, Zählung 20 noch sein und Sie würden außerhalb der Grenzen auf dem IList gehen <>

Grundsätzlich, wenn Sie entfernen möchten / add Sachen während darüber iterieren Sie so etwas wie

zu tun haben
for (int i = 0; i < ListBox1.Items.Count; i++)
{
   if (ListBox1.Items[i].Selected)
   {
      ListBox1.Items.RemoveAt(i)
      i--;
   }
}

Beachten Sie die i--, wenn Sie etwas entfernen. Lassen Sie uns sagen Artikel [2] ausgewählt ist, würde Ihre Schleife gehen:

  1. wenn Count> 0 gehen
  2. , wenn das Element [0] gewählt wird, entfernen Sie es (es ist nicht)
  3. erhöhen unsere Zähler
  4. wenn Count> 1 fortfahren
  5. , wenn das Element [1] ausgewählt ist, entfernen Sie es (es ist nicht)
  6. erhöhen unsere Zähler
  7. wenn Count> 2 fortfahren
  8. Artikel [2] ausgewählt ist, entfernen Sie es (es ist)
  9. entfernen Artikel [2] (jetzt, was zuvor Punkt [3] Artikel [2]
  10. verringern unsere Zähler
  11. erhöhen unsere Zähler
  12. wenn Count> 2 fortfahren
  13. ...

Hope, das hilft:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top