Principales respuestas
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
Respuestas
-
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.- Marcado como respuesta Enrique M. MontejoModerator martes, 24 de enero de 2017 12:35
- Desmarcado como respuesta Negochile martes, 24 de enero de 2017 21:26
- Marcado como respuesta Enrique M. MontejoModerator miércoles, 25 de enero de 2017 10:15
- Desmarcado como respuesta Negochile jueves, 26 de enero de 2017 19:26
- Marcado como respuesta Joyce_ACModerator viernes, 27 de enero de 2017 17:20
Todas las respuestas
-
-
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
-
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.- Marcado como respuesta Enrique M. MontejoModerator martes, 24 de enero de 2017 12:35
- Desmarcado como respuesta Negochile martes, 24 de enero de 2017 21:26
- Marcado como respuesta Enrique M. MontejoModerator miércoles, 25 de enero de 2017 10:15
- Desmarcado como respuesta Negochile jueves, 26 de enero de 2017 19:26
- Marcado como respuesta Joyce_ACModerator viernes, 27 de enero de 2017 17:20
-
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.
-
¿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
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios. -
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
- Marcado como respuesta Negochile martes, 24 de enero de 2017 21:25
- Desmarcado como respuesta Enrique M. MontejoModerator miércoles, 25 de enero de 2017 10:15
- Marcado como respuesta Negochile jueves, 26 de enero de 2017 19:27
- Desmarcado como respuesta Joyce_ACModerator viernes, 27 de enero de 2017 17:19