none
Estructuras ,Eliminar elementos. RRS feed

  • Pregunta

  • Hola !

    Estoy practicando en vb. y estoy en el uso de estructuras.

    Module Biblioteca
        'Se genera la estructura para registrar los libros'
    
        Public Structure Libros
            Dim CodLib As String
            Dim Nombre As String
            Dim NumPagi As String
        End Structure
        'Creamos las variables'
        Public Book As Libros
    
        'Creacion de arreglos'
        Public Books(0) As Libros
    

    luego cree un variable para cargar losdatos .Y bueno ,ingresaba los datos 

    With Book .CodLib = lblcodigo.Text .Nombre = txtNomIndice.Text .NumPagi = txtNroPagina.Text End With

    ReDim Preserve Books(UBound(Books) + 1)


    y lo agregaba a un datagridview,pues pies,para eliminar extraía el codlib y hacia un bucle para encontrar la similitud y ponia sus valores en "",cosa que no creo que sea la manera correcta de "eliminar",Como puedo eliminar un elemento ?

    Bendiciones.



    domingo, 2 de julio de 2017 2:19

Respuestas

  • "Franco Vargas" preguntó:

    > Como puedo eliminar un elemento ?

    Hola, Franco:

    Poco tiene que ver tu pregunta con el enunciado de la misma (Estructuras, Eliminar elementos), porque que yo sepa, de una estructura (o de una clase) NO SE PUEDE ELIMINAR ELEMENTOS porque no existen como tal. Se podrán eliminar elementos de una colección, lista o de un array, que es tu caso, pero no de la definición de la estructura o de una clase cualquiera.

    >   Public Structure Libros
    >        Dim CodLib As String
    >        Dim Nombre As String
    >        Dim NumPagi As String
    >    End Structure

    Entiendo que el nombre de la estructura debería ir en SINGULAR (Libro) no en plural (Libros), porque como acabo de indicar, una estructura no contiene elementos, de ahí que en el ejemplo que te voy a indicar, utilice Libro en lugar de Libros.

    En plural iría el NOMBRE DE LA MATRIZ, la cual la puedes declarar de alguna de las siguientes maneras:

        Public Books() As Libros  ' Declaración clásica
    
        Public Books As Libro()   ' Nueva declaración de Visual Basic .NET.

    Tampoco es necesario que a la vez que declaras la matriz le asignes un elemento:

    >   Public Books(0) As Libros


    > ... pero por estudios ,me obligan a estructuras,cosas que no se puede dejar ...

    Estoy de acuerdo en que las estructuras no se pueden dejar de estudiar apartándolas a un lado, porque en el mundo de la programación no todo es una clase. ;-)

    Como parece ser que la eliminación la deseas hacer sin utilizar listas intermedias, LINQ ni funciones lambda, es decir, utilizando exclusivamente matrices y código "puro y duro" de Visual Basic, no te va a quedar más remedio que utilizar una función auxiliar para tal propósito, porque las matrices no tienen ningún método para eliminar directamente un elemento, de ahí que seamos nosotros mismos los que implementemos dicho método.

    Aprovechando que defines la estructura Libro en un Module, inserta en el mismo la siguiente función:

        ''' <summary>
        ''' Devuelve una nueva matriz previa eliminación de los elementos cuyo
        ''' CodLib coincida con el valor especificado.
        ''' </summary>
        ''' <param name="arr">Matriz de tipo Libro.</param>
        ''' <param name="codLib">CodLib cuyo elementos se desean eliminar.</param>
        ''' <returns></returns>
        <Runtime.CompilerServices.Extension()>
        Public Function EliminarElemento(arr As Libro(), codLib As String) As Libro()
    
            Dim temp As Libro() = Nothing
            Dim index As Integer
    
            If (Not arr Is Nothing) Then
                ' Inicializar una nueva matriz temporal.
                temp = New Libro(arr.Length - 1) {}
                For Each item As Libro In arr
                    If (Not item.CodLib.Equals(codLib, StringComparison.OrdinalIgnoreCase)) Then
                        ' El elemento actual NO COINCIDE con el valor CodLib especificado;
                        ' lo añadimos a la matriz temporal.
                        temp(index) = item
                        index += 1
                    End If
                Next
            End If
    
            ' Declarar una nueva matriz con el número de elementos válidos,
            ' es decir, con el valor que tenga la variable 'index'.
            '
            Dim nuevaMatriz As Libro() = New Libro(index - 1) {}
    
            ' Copiamos a la nueva matriz el número de elementos válidos
            ' existentes en la matriz temporal.
            '
            Array.Copy(temp, nuevaMatriz, index)
    
            ' Devolvemos la nueva matriz.
            '
            Return nuevaMatriz
    
        End Function

    Observa que he declarado la función con el atributo <Runtime.CompilerServices.Extension()>, lo que significa que es un método de extensión.

    Ahora, cuando desees eliminar un elemento cualquier de una matriz llamarías al método EliminarElemento como indico a continuación:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Declaramos una matriz del tipo Libro con cinco elementos.
                '
                Dim libros As Libro() = New Libro() {
                    New Libro() With {.CodLib = "Cod1", .Nombre = "Nombre1", .NumPagi = "1"},
                    New Libro() With {.CodLib = "Cod2", .Nombre = "Nombre2", .NumPagi = "2"},
                    New Libro() With {.CodLib = "Cod3", .Nombre = "Nombre3", .NumPagi = "3"},
                    New Libro() With {.CodLib = "Cod4", .Nombre = "Nombre4", .NumPagi = "4"},
                    New Libro() With {.CodLib = "Cod5", .Nombre = "Nombre5", .NumPagi = "5"}
                    }
    
                ' Procedemos a eliminar el elemento cuyo CodLib es igual a "Cod3"
                '
                libros = libros.EliminarElemento("Cod3")
    
                ' Recorremos la matriz obtenida, mostrando su resultado en la ventana de Salida
                For Each item As Libro In libros
                    Console.WriteLine("CodLib = {0}, Nombre = {1}, NumPagi = {2}", item.CodLib, item.Nombre, item.NumPagi)
                Next
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Fíjate bien cómo llamamos al método EliminarElemento:

        libros = libros.EliminarElemento("Cod3")

    Al declararlo como un método de extensión, estamos indicando que ese método puede ser utilizado por aquellas variables que se encuentren declaradas con el tipo de dato Libro(), es decir, hemos sido capaces de añadir un método para eliminar un elemento cualquiera de una matriz. ;-)

    ¡Eso es todo! Estudia el código y adáptalo a tus necesidades.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    domingo, 2 de julio de 2017 9:20
    Moderador

Todas las respuestas

  • Si, justo como dices,ya he  usado list y normal pero por estudios ,me obligan a estructuras,cosas que no se puede dejar ,gracias por la ayuda!
    domingo, 2 de julio de 2017 3:16
  • Sí, justo como dices ya he usado List y normal pero por estudios me obligan a estructuras, cosas que no se puede dejar

    La T de List<T> puede ser un tipo de valor o referencia, por lo mismo puede tratarse de un tipo basado en una clase o estructura.

    Pero insistamos entonces con la gestión de elementos contenidos en un array. La cláusula REDIM no escala la longitud del array sino que crea un nuevo array reemplazando la referencia del array existente y la cláusula PRESERVE establece la copia de los elementos existentes en el nuevo array. En consecuencia, y basados en el comportamiento de la cláusula REDIM, podemos hacer lo mismo para quitar un elemento de la colección, es decir, discriminamos las filas que deseas quitar de la colección y las filas afectadas se copian en un nuevo array que reemplaza la referencia del array existente.

    'Creacion del array
    Dim Books(0) As Libros
    
    ReDim Preserve Books(UBound(Books) + 1)
    Books(0) = New Libros() With {.CodLib = "Cod1", .Nombre = "Nombre1", .NumPagi = "1"}
    
    ReDim Preserve Books(UBound(Books) + 1)
    Books(1) = New Libros() With {.CodLib = "Cod2", .Nombre = "Nombre2", .NumPagi = "2"}
    
    'Quitar un elemento del array
    Books = Books.Where(Function(b) b.CodLib <> "Cod2" AndAlso b.CodLib IsNot Nothing).ToArray()


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 2 de julio de 2017 4:23
  • "Franco Vargas" preguntó:

    > Como puedo eliminar un elemento ?

    Hola, Franco:

    Poco tiene que ver tu pregunta con el enunciado de la misma (Estructuras, Eliminar elementos), porque que yo sepa, de una estructura (o de una clase) NO SE PUEDE ELIMINAR ELEMENTOS porque no existen como tal. Se podrán eliminar elementos de una colección, lista o de un array, que es tu caso, pero no de la definición de la estructura o de una clase cualquiera.

    >   Public Structure Libros
    >        Dim CodLib As String
    >        Dim Nombre As String
    >        Dim NumPagi As String
    >    End Structure

    Entiendo que el nombre de la estructura debería ir en SINGULAR (Libro) no en plural (Libros), porque como acabo de indicar, una estructura no contiene elementos, de ahí que en el ejemplo que te voy a indicar, utilice Libro en lugar de Libros.

    En plural iría el NOMBRE DE LA MATRIZ, la cual la puedes declarar de alguna de las siguientes maneras:

        Public Books() As Libros  ' Declaración clásica
    
        Public Books As Libro()   ' Nueva declaración de Visual Basic .NET.

    Tampoco es necesario que a la vez que declaras la matriz le asignes un elemento:

    >   Public Books(0) As Libros


    > ... pero por estudios ,me obligan a estructuras,cosas que no se puede dejar ...

    Estoy de acuerdo en que las estructuras no se pueden dejar de estudiar apartándolas a un lado, porque en el mundo de la programación no todo es una clase. ;-)

    Como parece ser que la eliminación la deseas hacer sin utilizar listas intermedias, LINQ ni funciones lambda, es decir, utilizando exclusivamente matrices y código "puro y duro" de Visual Basic, no te va a quedar más remedio que utilizar una función auxiliar para tal propósito, porque las matrices no tienen ningún método para eliminar directamente un elemento, de ahí que seamos nosotros mismos los que implementemos dicho método.

    Aprovechando que defines la estructura Libro en un Module, inserta en el mismo la siguiente función:

        ''' <summary>
        ''' Devuelve una nueva matriz previa eliminación de los elementos cuyo
        ''' CodLib coincida con el valor especificado.
        ''' </summary>
        ''' <param name="arr">Matriz de tipo Libro.</param>
        ''' <param name="codLib">CodLib cuyo elementos se desean eliminar.</param>
        ''' <returns></returns>
        <Runtime.CompilerServices.Extension()>
        Public Function EliminarElemento(arr As Libro(), codLib As String) As Libro()
    
            Dim temp As Libro() = Nothing
            Dim index As Integer
    
            If (Not arr Is Nothing) Then
                ' Inicializar una nueva matriz temporal.
                temp = New Libro(arr.Length - 1) {}
                For Each item As Libro In arr
                    If (Not item.CodLib.Equals(codLib, StringComparison.OrdinalIgnoreCase)) Then
                        ' El elemento actual NO COINCIDE con el valor CodLib especificado;
                        ' lo añadimos a la matriz temporal.
                        temp(index) = item
                        index += 1
                    End If
                Next
            End If
    
            ' Declarar una nueva matriz con el número de elementos válidos,
            ' es decir, con el valor que tenga la variable 'index'.
            '
            Dim nuevaMatriz As Libro() = New Libro(index - 1) {}
    
            ' Copiamos a la nueva matriz el número de elementos válidos
            ' existentes en la matriz temporal.
            '
            Array.Copy(temp, nuevaMatriz, index)
    
            ' Devolvemos la nueva matriz.
            '
            Return nuevaMatriz
    
        End Function

    Observa que he declarado la función con el atributo <Runtime.CompilerServices.Extension()>, lo que significa que es un método de extensión.

    Ahora, cuando desees eliminar un elemento cualquier de una matriz llamarías al método EliminarElemento como indico a continuación:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Declaramos una matriz del tipo Libro con cinco elementos.
                '
                Dim libros As Libro() = New Libro() {
                    New Libro() With {.CodLib = "Cod1", .Nombre = "Nombre1", .NumPagi = "1"},
                    New Libro() With {.CodLib = "Cod2", .Nombre = "Nombre2", .NumPagi = "2"},
                    New Libro() With {.CodLib = "Cod3", .Nombre = "Nombre3", .NumPagi = "3"},
                    New Libro() With {.CodLib = "Cod4", .Nombre = "Nombre4", .NumPagi = "4"},
                    New Libro() With {.CodLib = "Cod5", .Nombre = "Nombre5", .NumPagi = "5"}
                    }
    
                ' Procedemos a eliminar el elemento cuyo CodLib es igual a "Cod3"
                '
                libros = libros.EliminarElemento("Cod3")
    
                ' Recorremos la matriz obtenida, mostrando su resultado en la ventana de Salida
                For Each item As Libro In libros
                    Console.WriteLine("CodLib = {0}, Nombre = {1}, NumPagi = {2}", item.CodLib, item.Nombre, item.NumPagi)
                Next
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Fíjate bien cómo llamamos al método EliminarElemento:

        libros = libros.EliminarElemento("Cod3")

    Al declararlo como un método de extensión, estamos indicando que ese método puede ser utilizado por aquellas variables que se encuentren declaradas con el tipo de dato Libro(), es decir, hemos sido capaces de añadir un método para eliminar un elemento cualquiera de una matriz. ;-)

    ¡Eso es todo! Estudia el código y adáptalo a tus necesidades.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    domingo, 2 de julio de 2017 9:20
    Moderador