2011-06-02 8 views
5

Estoy tratando de eliminar mi elemento actual para cada bucle si algunos criterios coinciden, pero su error desencadenante después de eliminar y bucles de nuevo.Eliminar el elemento actual de la lista si algunos criterios coinciden con

Mi código de ejemplo:

 For Each Item As BookingRoom In myBookedRooms 
      If Item.RoomInfo.UIN = myRoom.UIN Then 
       myBookedRooms.Remove(Item) 
       Continue For 
      End If 
     Next 

* Nota RoomInfo y myroom son las dos instancias de la clase de habitaciones

estoy usando myBookedRooms.remove pero su error trigerring así que lo que puede ser el camino correcto para hacerlo ? es decir, eliminar la habitación reservada si la id de la habitación coincide con la seleccionada

Respuesta

9

El problema es que está modificando la colección mientras la itera.

Se puede recorrer la lista en orden inverso con un bucle for:

For i = myBookedRooms.Count - 1 To 0 Step -1 
    If myBookedRooms(i).RoomInfo.UIN = myRoom.UIN Then 
     myBookedRooms.RemoveAt(i) 
    End If 
Next 

alternativa, puede utilizar el RemoveAll method: Otra opción

myBookedRooms.RemoveAll(Function(item) item.RoomInfo.UIN = myRoom.UIN) 

es utilizar el Enumerable.Where method para filtrar los resultados, pero a diferencia de los dos enfoques anteriores, debe invertir la verificación lógica para excluir los elementos coincidentes, ya que la intención es eliminarlos:

myBookedRooms = myBookedRooms 
        .Where(Function(item) item.RoomInfo.UIN <> myRoom.UIN) 
        .ToList() 
+0

'.Except (...) .ToList()' también funcionaría. –

+0

@Joel ¿quisiste decir 'Dónde'? 'Excepto' requeriría una segunda secuencia. Actualizado para incluir 'Donde'. –

+0

Sí, quise decir Dónde() :( –

Cuestiones relacionadas