¿Cómo puedo utilizar el método foreach en lugar de para el método con el método remove del cuadro de lista?
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);
}
}
}
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:
- Si el recuento> 0 proceder
- si se selecciona el punto [0], y eliminar (no es)
- incrementar nuestro contador
- Si el recuento de> 1 proceder
- si se selecciona el punto [1], y eliminar (no es)
- incrementar nuestro contador
- Si el recuento> 2 proceder
- elemento [2] está seleccionado, retírela (es)
- eliminar elemento [2] (ahora, lo que antes era el punto [3] será el punto [2]
- disminuir nuestro contador
- incrementar nuestro contador
- Si el recuento> 2 proceder
- ...
Espero que esto ayude:)