none
Borrar varios elementos de una List(Of T) RRS feed

  • Pregunta

  • Estimados:

    Cómo puedo borrar varios elementos de una lista, de acuerdo a un criterio? Cada elemento de la lista es una estructura y deseo remover sólo los que tienen un valor determinado en un elemento de la estructura. 

    Usando un For Each, al borrar un elemento, se produce un error, ya que se modifica la cantidad de elementos de la lista.

    Muchas gracias


    Daniel_tango

    jueves, 24 de agosto de 2017 19:51

Respuestas

  • dibujo_zona.RemoveAll(Function(z) z.num_zona = zona_actual)

    si no les importa que me entrometa...

    viernes, 25 de agosto de 2017 14:26
  • Buenas compañero, 

    Ya perdonarás marear tanto,  mi campo es c#... xD

    dibujo_zona.RemoveAll(Function(x) x.num_zona = zona_actual)

    He traducido la función,  prueba a ver y nos comentas. 

    Atte


    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!

    viernes, 25 de agosto de 2017 14:25
  • Hola Pedro

    Gracias por responder.

    Es algo así:

        <Serializable> Structure str_dibujo_zona
            Dim num_zona As Integer ' 0 a n.pares: izquierda
            Dim x1 As Single ' coordenadas de inicio y fin del segmento, en % del dibujo
            Dim y1 As Single
            Dim x2 As Single
            Dim y2 As Single
            Dim color_segmento As Color
        End Structure
    
        Public dibujo_zona As New List(Of str_dibujo_zona) ' conjunto de coordenadas de las zonas
    
    ------------------------
    
              For Each segmento In dibujo_zona
                    If segmento.num_zona = zona_actual Then dibujo_zona.Remove(segmento)
                Next
    
    

    Al ejecutar el For Each, se produce un error, ya que se altera el Count. Además, tené en cuenta que son varios los segmento con num_zona=zona_actual.

    Lo resolví copiando los elementos que tienen num_zona<> zona_actual a otra lista, pero imagino que debe haber otra forma.

    Gracias!


    Daniel_tango

    Cuando Ocupas un For Each, extraes  cada elemento de la lista, por tanto la lista, al eliminar elementos, recorre los siguientes y la lista se reestructura.

    Así que en caso, de usar un ciclo, te recomendaría un For simple con lo puedes tener control sobre los indices, y ocuparías el método RemoveAt.

    En el caso de ocupar de ocupar:

    dibujo_zona.RemoveAll(Function(z) z.num_zona = zona_actual)
    Ya no harías uso del bucle, el método en si, incluye su propio iterador.


    viernes, 25 de agosto de 2017 15:27

Todas las respuestas

  • Hola

    Podrías regalarnos más información como mostrando el código que estas implementando, ¿esa colección de datos esta ligado a un datasource?

    Saludos


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    jueves, 24 de agosto de 2017 20:29
  • Hola Pedro

    Gracias por responder.

    Es algo así:

        <Serializable> Structure str_dibujo_zona
            Dim num_zona As Integer ' 0 a n.pares: izquierda
            Dim x1 As Single ' coordenadas de inicio y fin del segmento, en % del dibujo
            Dim y1 As Single
            Dim x2 As Single
            Dim y2 As Single
            Dim color_segmento As Color
        End Structure
    
        Public dibujo_zona As New List(Of str_dibujo_zona) ' conjunto de coordenadas de las zonas
    
    ------------------------
    
              For Each segmento In dibujo_zona
                    If segmento.num_zona = zona_actual Then dibujo_zona.Remove(segmento)
                Next
    
    
    

    Al ejecutar el For Each, se produce un error, ya que se altera el Count. Además, tené en cuenta que son varios los segmento con num_zona=zona_actual.

    Lo resolví copiando los elementos que tienen num_zona<> zona_actual a otra lista, pero imagino que debe haber otra forma.

    Gracias!


    Daniel_tango

    jueves, 24 de agosto de 2017 20:44
  • Buenas compañero, 

    Checa esto:

    dibujo_zona.RemoveRange(dibujo_zona.FindAll(x=>x.num_zona = zona_actual)) 

    Puede que haya algún error de sintaxis,  desde el móvil... xD

    Atte


    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!


    viernes, 25 de agosto de 2017 8:19
  • Mmhh, si.

    RemoveRange requiere dos parámetros: index y count. Parece ser para elementos sucesivos, que no es mi caso.

    Pareciera que es posible usar RemoveAll, pero no sé como construir el parámetro Predicate:

    PublicFunction RemoveAll ( _ match As Predicate(Of T) _ ) As Integer

    Saludos


    Daniel_tango

    viernes, 25 de agosto de 2017 13:29
  • Okey, 

    Prueba esto:

    dibujo_zona.RemoveAll(x=>x.num_zona = zona_actual)
    Atte


    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!

    viernes, 25 de agosto de 2017 14:12
  • Error indicado: el operador => no está definido...

    Cordialmente


    Daniel_tango

    viernes, 25 de agosto de 2017 14:20
  • Buenas compañero, 

    Ya perdonarás marear tanto,  mi campo es c#... xD

    dibujo_zona.RemoveAll(Function(x) x.num_zona = zona_actual)

    He traducido la función,  prueba a ver y nos comentas. 

    Atte


    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!

    viernes, 25 de agosto de 2017 14:25
  • dibujo_zona.RemoveAll(Function(z) z.num_zona = zona_actual)

    si no les importa que me entrometa...

    viernes, 25 de agosto de 2017 14:26
  • Hola Pedro

    Gracias por responder.

    Es algo así:

        <Serializable> Structure str_dibujo_zona
            Dim num_zona As Integer ' 0 a n.pares: izquierda
            Dim x1 As Single ' coordenadas de inicio y fin del segmento, en % del dibujo
            Dim y1 As Single
            Dim x2 As Single
            Dim y2 As Single
            Dim color_segmento As Color
        End Structure
    
        Public dibujo_zona As New List(Of str_dibujo_zona) ' conjunto de coordenadas de las zonas
    
    ------------------------
    
              For Each segmento In dibujo_zona
                    If segmento.num_zona = zona_actual Then dibujo_zona.Remove(segmento)
                Next
    
    

    Al ejecutar el For Each, se produce un error, ya que se altera el Count. Además, tené en cuenta que son varios los segmento con num_zona=zona_actual.

    Lo resolví copiando los elementos que tienen num_zona<> zona_actual a otra lista, pero imagino que debe haber otra forma.

    Gracias!


    Daniel_tango

    Cuando Ocupas un For Each, extraes  cada elemento de la lista, por tanto la lista, al eliminar elementos, recorre los siguientes y la lista se reestructura.

    Así que en caso, de usar un ciclo, te recomendaría un For simple con lo puedes tener control sobre los indices, y ocuparías el método RemoveAt.

    En el caso de ocupar de ocupar:

    dibujo_zona.RemoveAll(Function(z) z.num_zona = zona_actual)
    Ya no harías uso del bucle, el método en si, incluye su propio iterador.


    viernes, 25 de agosto de 2017 15:27
  • Gracias a todos por sus contribuciones!!

    Daniel_tango

    viernes, 25 de agosto de 2017 17:41