none
Como saber si una posicion de un array esta vacia

    Pregunta

  • Estimado, Bendiciones.

    Bueno el problema es el siguiente carge un array de string con datos y al recorrerlo quisiera saber si la posición actual esta vacia o tiene en su defecto caracteres de espacio,

    Probé varias formas de revisar esto el length, el string.isnullorempty pero me salta la excepción.

    la verdad revise las clases string y array, no se donde buscar.

    Espero me puedas entender y ayudar 

    sábado, 21 de enero de 2017 22:34

Respuestas

  • Negochile,

    Me hubiese gustado ver el contexto en el que sucede el problema, pero vamos a ensayar un ejemplo y dar algo de teoría:

    Los tipos de dato se clasifican según donde almacenan sus datos, si almacena sus propios datos se trata de un tipo de valor (int, boolean, etc.), si almacenan un puntero a una dirección de memoria donde se encuentran los datos se trata de un tipo de referencia. Un tipo String es un tipo de referencia y requiere ser inicializado (tal como sucede con un array  que también es un tipo por referencia), por tanto si no ha sido inicializado es Nothing.

    Imagino que ya estarás intuyendo que los elementos de un array de tipo String son inicializados en Nothing en tanto no hayas inicializado con algún valor, vamos por un ejemplo:

    'Creamos un array unidimensional y definimos el tamaño a 3 posiciones
    Dim arrDato1(2) As String 'Cada elemento se inicializa con Nothing
    
    'Cada elemento del array es Nothing, por tanto
    If arrDato1(0) IsNot Nothing Then
    	MessageBox.Show(arrDato1(0))
    Else
    	MessageBox.Show("El elemento 0 no contiene un valor")
    End If
    
    'Inicializar el array
    'Dim arrDato1 As String() = {"Juan", "Marcos", "Javier"}

    - Por lo comentado, para el caso que propones será:

    If arrDato1(contador) Is Nothing Then 'El elemento no contiene un valor


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 22 de enero de 2017 1:01

Todas las respuestas

  • Negochile,

    ¿Qué excepción obtienes?

    Ayuda mucho a entender el caso si muestras el código que has desarrollado y la excepción que obtienes.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 21 de enero de 2017 23:00
  • Verdad,

    su sede en por ejemplo usando la propiedad length o  el método string.isnullor en

    if arrDato1(contador).Trim.Length() <1 then

    la execpcion que me muestra es: NullReferenceException  - Refencia a Objeto no establecida como instacia de un objeto

    espero esto muestre alguna luz del por que no funciona

    domingo, 22 de enero de 2017 0:18
  • Negochile,

    Me hubiese gustado ver el contexto en el que sucede el problema, pero vamos a ensayar un ejemplo y dar algo de teoría:

    Los tipos de dato se clasifican según donde almacenan sus datos, si almacena sus propios datos se trata de un tipo de valor (int, boolean, etc.), si almacenan un puntero a una dirección de memoria donde se encuentran los datos se trata de un tipo de referencia. Un tipo String es un tipo de referencia y requiere ser inicializado (tal como sucede con un array  que también es un tipo por referencia), por tanto si no ha sido inicializado es Nothing.

    Imagino que ya estarás intuyendo que los elementos de un array de tipo String son inicializados en Nothing en tanto no hayas inicializado con algún valor, vamos por un ejemplo:

    'Creamos un array unidimensional y definimos el tamaño a 3 posiciones
    Dim arrDato1(2) As String 'Cada elemento se inicializa con Nothing
    
    'Cada elemento del array es Nothing, por tanto
    If arrDato1(0) IsNot Nothing Then
    	MessageBox.Show(arrDato1(0))
    Else
    	MessageBox.Show("El elemento 0 no contiene un valor")
    End If
    
    'Inicializar el array
    'Dim arrDato1 As String() = {"Juan", "Marcos", "Javier"}

    - Por lo comentado, para el caso que propones será:

    If arrDato1(contador) Is Nothing Then 'El elemento no contiene un valor


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 22 de enero de 2017 1:01
  • Williams, gracias por responder.

    Mira "carge un array de string con datos y al recorrerlo quisiera saber si la posición actual esta vacia o tiene en su defecto caracteres de espacio", osea:

    Dim arrDato1 as string() 'No se a definido la cantidad de ítem ósea sta en Nothing

    Cuando supe la cantidad de ítem lo redimencione:

    ReDim arrDato1(N)

    Después lo carge...(Usando cualquier método valido para hacer el llenado de cada ítem del array), y lo quería recorrer usande un for each y una de las comprobaciones que quería realizar dentro era si la posición actual estaba vacia o tenia caracteres de espacio.

    Espero me comprendas.

    domingo, 22 de enero de 2017 3:53
  • Negochile,

    ¿Leíste la explicación de los tipos de referencia que escribí en el aporte anterior?

    Pues la excepción que obtienes es porque intentas acceder a las propiedades de un elemento que es Nothing y lamento no ser preciso pero no adjuntas todo el código necesario para indicarte donde es que cometes el error, no siempre es la misma línea donde se desencadena la excepción por tanto no vale colocar sólo "la línea".

    Es necesario que tengas claro que cuando defines un número de elementos para una dimensión del array todos los elementos se inicializan en Nothing (dado que el array es de tipo String), claro, sólo hasta que establezcas un valor al elemento.

    Has la siguiente prueba:

    Dim MiArray As String()
    
    'Redimensionar el tamaño de 0 a 2 elementos: 0, 1, 2
    ReDim MiArray(2)
    'MiArray(0) : Nothing
    'MiArray(1) : Nothing
    'MiArray(2) : Nothing
    
    '¿Qué sucede si intentas acceder al primer elemento del array -por ejemplo- para conocer la longitud?
    Dim Longitud As Integer = MiArray(0).Trim.Length
    'Resultado: Excepción: Referencia a objeto no establecida como instancia de un objeto.

    Algo que también debes tener claro es que el tamaño de una dimensión viene de 0 al número establecido, quizá ahí cometes el error, nota que en el ejemplo anterior establecemos el tamaño de la dimensión del array a 2, pero no refiere a 2 elementos sino a 3 elementos: elemento 0, elemento 1 y elemento 2.

    Vamos a poner un ejemplo donde a propósito no asignamos un valor al último elemento.

    Dim MiArray As String()
    
    'Redimensionar el tamaño de 0 a 3 elementos
    ReDim MiArray(3)
    
    'Agregar elementos al array
    MiArray(0) = "Primero"
    MiArray(1) = "Segundo"
    MiArray(2) = "  " 'Espacios en blanco
    'MiArray(3) = "Cuarto"::: No asignamos un valor por tanto vale Nothing
    
    'Recorrer el array
    For Each Elemento As String In MiArray
    	If Elemento.Trim = String.Empty Then
    		MessageBox.Show("Elemento vacío")
    	Else
    		MessageBox.Show(Elemento)
    	End If
    Next

    ¿Qué crees que sucede cuando itere por el último elemento?

    Pues nuevamente la excepción de siempre porque estamos intentando acceder a la propiedad Trim cuando el elemento es Nothing, por tanto, si dejamos "a propósito" algún elemento sin asignar un valor habrá que preguntar si es Nothing antes de intentar acceder a una propiedad

    Dim MiArray As String()
    
    'Redimensionar el tamaño de 0 a 3 elementos
    ReDim MiArray(3)
    
    'Agregar elementos al array
    MiArray(0) = "Primero"
    MiArray(1) = "Segundo"
    MiArray(2) = "  " 'Espacios en blanco
    'MiArray(3) = "Cuarto"::: No asignamos un valor por tanto vale Nothing
    
    'Recorrer el array
    For Each Elemento As String In MiArray
    	If Elemento IsNot Nothing Then
    		If Elemento.Trim = String.Empty Then
    			MessageBox.Show("Elemento vacío")
    		Else
    			MessageBox.Show(Elemento)
    		End If
    	Else
    		MessageBox.Show("Nothing")
    	End If
    Next

    Claro que hubiese bastado utilizar el método 'String.IsNullOrWhiteSpace(Elemento)', pero para el ejemplo pasamos la previa validación por Nothing.

    Por otro lado, el uso de la instrucción Redim [Preserve] sirve para cuando redimensionas más de una vez el array, pero si sólo lo haces una vez entonces no es necesario, puedes crear primero el array y luego definir la longitud de la dimensión, algo como:

    Dim MiArray As String()
    
    '...
    Dim Size As Integer = 3
    
    MiArray = New String(Size) {}

    Finalmente, recuerdo que mencionaste que vienes de Visual Basic 6 donde se usa mucho los array, el marco de trabajo de .Net implementa la gestión de colecciones y la expone de una manera simple y fácil de usar. El criterio es el siguiente, si el tamaño de la colección se conoce a priori puedes utilizar un array o -por ejemplo- una lista (List<T>), pero si el número de elementos es dinámico entonces una buena decisión es dejar de lado el array y apostar -por ejemplo- por una lista (List<T>), Clase List

    <t></t>


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 22 de enero de 2017 5:21
  • Willams Morales

    Primero te cuento, que después de leer tu post, revise el mío y me di cuenta que el array por el cual estaba preguntando ni siquiera lo definida, uuuuu, me reía solo. el dia del coco funcionaria...

    Como tu bien dices bastaba con 'String.IsNullOrWhiteSpace(Elemento)'. pero si lo hacia sobre el array correcto ....

    Bueno, que te puedo decir leí lo de las listas pero voy a interiorizarme mas leyendo la clase, y te aclaro 2 cosas:

    Primero: Lei el tema de las referencias y ya lo tenia claro. pero a tu favor no me explique bien, sorry.

    Segundo: En vb6 al menos yo no era asiduo de los array si se usan pero cuando son necesario por que consumen cilos de cpu y memoria.

    Bueno, gracias por la ayuda y la aclaracion de tu parte, podría decir que me ayudaste ... jajaja

    martes, 24 de enero de 2017 21:25