come posso utilizzare il metodo foreach anziché il metodo for con il metodo di rimozione della casella di riepilogo?

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

  •  23-08-2019
  •  | 
  •  

Domanda

Come posso usare secondo metodo invece di Primo?

prima (controllo utente web)

   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 del primo)

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

        }

secondo (controllo utente web)

 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 del secondo)

  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);
                    }
                }
        }
È stato utile?

Soluzione

Non puoi usare foreach se stai rimuovendo i dati all'interno del file foreach - rompe (intenzionalmente) l'iteratore.

Se for funziona, perché cambiarlo?Se sei disperato usare foreach, quindi crea a separato elenca prima - ad esempio:

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
}

La prima query può spesso essere semplificata da LINQ se disponibile.

Altri suggerimenti

È possibile ottenere i valori da rimuovere prima ad una lista e poi farli passare attraverso la funzione di rimozione. Questo può essere ulteriormente migliorato se necessario.

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

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

Non è possibile modificare una raccolta si effettua l'iterazione in un ciclo foreach.

Detto questo, sembra che si sta tentando di rimuovere gli elementi selezionati da un ListBox. Si potrebbe anche usare qualcosa come:

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

Beh, non è possibile apportare modifiche a un IList <> con foreach, semplicemente perché sarebbe cambiare il numero di elementi in esso.

Inoltre, il 1 ° metodo che ha mostrato sono irregolari, in quanto conteggio potrebbe iniziare come 20, ma se si rimuove 10 articoli con il vostro metodo, count sarà ancora 20 e si dovrebbe andare fuori dai limiti sul IList <>

In sostanza, se si desidera rimuovere / aggiungere roba mentre l'iterazione su di esso si deve fare qualcosa di simile

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

Si noti la I-- se si rimuove qualcosa. Diciamo che è selezionata la voce [2], il ciclo sarebbe andato:

  1. se Conte> 0 procedere
  2. se si seleziona la voce [0], rimuoverla (non è)
  3. incrementare il nostro contatore
  4. se Conte> 1 procedere
  5. se si seleziona la voce [1], rimuoverla (non è)
  6. incrementare il nostro contatore
  7. se Conte> 2 procedere
  8. voce [2] è selezionato, rimuoverlo (è)
  9. rimuovere voce [2] (ora, quello che prima era oggetto [3] sarà oggetto [2]
  10. decrementare il nostro contatore
  11. incrementare il nostro contatore
  12. se Conte> 2 procedere
  13. ...

Spero che questo aiuti:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top