¿Cómo puedo utilizar el método foreach en lugar de para el método con el método remove del cuadro de lista?

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

  •  23-08-2019
  •  | 
  •  

Pregunta

¿Cómo puedo utilizar segundo método en lugar de primera

primera (control de usuario 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 de primera)

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

        }

segundo (control de usuario 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 (Examen de Segunda)

  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);
                    }
                }
        }
¿Fue útil?

Solución

No se puede utilizar foreach si va a quitar de datos dentro de la foreach - que (intencionalmente) rompe el iterador

.

Si las obras for, ¿por qué cambiarlo? Si usted es desesperada para utilizar foreach, a continuación, crear un separada en primer lugar - por ejemplo:

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 primera consulta a menudo se puede simplificar si LINQ si está disponible.

Otros consejos

Puede obtener los valores a ser eliminados primero en una lista y luego ejecutar a través de la función de eliminación. Esto se puede mejorar aún más si es necesario.

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

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

No se puede modificar una colección que se está interactuando sobre en un bucle foreach.

Una vez dicho esto, parece que está tratando de eliminar los elementos seleccionados de un ListBox. También es posible usar algo como:

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

Bueno, no se puede realizar ningún cambio a un IList <> con foreach, simplemente porque sería cambiar el número de elementos en ella.

Además, la primera método que mostró son erróneas, ya que el recuento podría empiezan como 20, pero si se quita 10 artículos con su método, el recuento todavía será 20 y se iría fuera de los límites de la IList <>

Básicamente, si desea eliminar / añadir materia mientras que la iteración en que usted tiene que hacer algo como

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

Note la yo-- si se quita nada. Digamos que el punto [2] está seleccionado, el bucle iría:

  1. Si el recuento> 0 proceder
  2. si se selecciona el punto [0], y eliminar (no es)
  3. incrementar nuestro contador
  4. Si el recuento de> 1 proceder
  5. si se selecciona el punto [1], y eliminar (no es)
  6. incrementar nuestro contador
  7. Si el recuento> 2 proceder
  8. elemento [2] está seleccionado, retírela (es)
  9. eliminar elemento [2] (ahora, lo que antes era el punto [3] será el punto [2]
  10. disminuir nuestro contador
  11. incrementar nuestro contador
  12. Si el recuento> 2 proceder
  13. ...

Espero que esto ayude:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top