Matrices en Visual Basic

Una matriz es un conjunto de valores relacionados lógicamente entre sí, como el número de estudiantes de cada curso en una escuela primaria.

Una matriz permite hacer referencia a estos valores relacionados mediante un mismo nombre y utilizar un número, denominado índice o subíndice, para distinguirlos. Los valores individuales se llaman elementos de la matriz. Son contiguos desde el índice 0 hasta el valor del índice superior.

A diferencia de una matriz, una variable que contiene un único valor se llama variable escalar.

Ejemplo

En el ejemplo siguiente se declara una variable de matriz para que contenga el número de estudiantes de cada curso en una escuela primaria.

Dim students(6) As Integer

La matriz students del ejemplo anterior contiene 7 elementos. Los índices de los elementos van de 0 a 6. Tener esta matriz es más fácil que declarar 7 variables diferentes.

En la siguiente ilustración se muestra la matriz students. Para cada elemento de la matriz:

  • El índice del elemento representa el curso (el índice 0 representa el jardín de infancia).

  • El valor contenido en el elemento representa el número de estudiantes en ese curso.

Elementos de la matriz "students"

Imagen de una matriz que muestra el número de estudiantes

En el ejemplo siguiente se muestra cómo hacer referencia al primer, segundo y último elemento de la matriz students.

Dim kindergarten As Integer = students(0)
Dim firstGrade As Integer = students(1)
Dim sixthGrade As Integer = students(6)
MsgBox("Students in kindergarten = " & CStr(kindergarten))
MsgBox("Students in first grade = " & CStr(firstGrade))
MsgBox("Students in sixth grade = " & CStr(sixthGrade))

Puede hacer referencia a la matriz en conjunto utilizando simplemente el nombre de la variable de la matriz sin índices.

Dimensiones de matriz

La matriz students del ejemplo anterior utiliza un índice y se dice que es unidimensional. Una matriz que utiliza más de un índice o subíndice se denomina multidimensional. Para obtener más información, vea Dimensiones de matrices en Visual Basic.

Otro tipo de matriz es el que contiene otras matrices como elementos. Esto se conoce como una matriz de matrices o una matriz escalonada. Una matriz escalonada puede ser unidimensional o multidimensional, y lo mismo sucede con sus elementos. En algunas ocasiones, la estructura de datos de la aplicación es bidimensional pero no rectangular. Por ejemplo, puede tener una matriz de meses, siendo cada elemento a su vez una matriz de días. Puesto que los distintos meses tienen un número distinto de días, los elementos no forman una matriz bidimensional rectangular. En este caso, puede utilizar una matriz escalonada en lugar de una matriz multidimensional.

Declarar una matriz

Una variable de matriz se declara de la misma manera que cualquier otra variable mediante la instrucción Dim. Se agregan uno o más pares de paréntesis a continuación del nombre de la variable para indicar que es para contener una matriz en vez de una variable escalar (una variable que contiene un solo valor).

Para declarar una variable de matriz unidimensional, agregue un par de paréntesis después del nombre de la variable.

Dim cargoWeights() As Double

Para declarar una variable de matriz multidimensional, agregue un par de paréntesis detrás del nombre de la variable y coloque comas dentro de los paréntesis para separar las dimensiones.

Dim atmospherePressures(,,,) As Short

Para declarar una variable de matriz escalonada, agregue tantos pares de paréntesis después del nombre de la variable como niveles haya de matrices anidadas.

Dim inquiriesByYearMonthDay()()() As Byte

En los ejemplos anteriores se declaran variables de matriz pero no se les asignan matrices. Debe crear una matriz, inicializarla y asignarla a la variable.

Matrices de longitud cero

Una matriz sin elementos se llama también una matriz de longitud cero. Un variable que contenga una matriz de longitud cero no tiene el valor Nothing. Para crear una matriz que no tenga elementos, declare que una de las dimensiones de la matriz sea -1, como se muestra en el ejemplo siguiente.

Dim twoDimensionalStrings(-1, 3) As String

Podría necesitar crear una matriz de longitud cero en las circunstancias siguientes:

  • Su código necesita tener acceso a los miembros de la clase Array, como Length o Rank, o llamar a una función de Visual Basic como UBound, sin arriesgarse a provocar una excepción NullReferenceException.

  • Desea que el código utilizado sea más sencillo sin tener que comprobar Nothing como caso especial.

  • El código interactúa con una interfaz de programación de aplicaciones (API) que le exige que pase una matriz de longitud cero a uno o más procedimientos o que devuelve una matriz de longitud cero desde uno o más procedimientos.

Crear una matriz

Una matriz se puede crear de dos maneras. Se puede proporcionar el tamaño de una matriz cuando se declara o, como una matriz es un objeto, puede crearse con una cláusula New (Operador, Visual Basic) y asignarla a la variable de matriz. Puede hacer esto como parte de la declaración de la matriz o en una instrucción de asignación subsiguiente como se muestra en el ejemplo siguiente.

cargoWeights = New Double() {}
atmospherePressures = New Short(,,,) {}
inquiriesByYearMonthDay = New Byte()()() {}

Tras la ejecución de estas instrucciones, la longitud de las matrices es 0.

Nota

La cláusula New debe especificar el nombre de tipo, seguido de paréntesis y seguido de llaves ({}). Los paréntesis no representan una llamada a un constructor de matriz. Indican que el tipo de objeto es un tipo de matriz. Se pueden proporcionar valores de inicialización entre llaves. El compilador requiere las llaves aunque no proporcionen ningún valor. Por consiguiente, la cláusula New debe incluir tanto paréntesis como llaves, aunque no contengan valores. Si se excluyen las llaves, el compilador supone que se está llamando al constructor para el tipo especificado.

Se puede definir el tamaño de una matriz de varias maneras diferentes. Se puede proporcionar el tamaño cuando se declara la matriz, como se muestra en el ejemplo siguiente.

Dim cargoWeights(10) As Double
Dim atmospherePressures(2, 2, 4, 10) As Short
Dim inquiriesByYearMonthDay(20)()() As Byte

También se puede proporcionar el tamaño de una matriz cuando se crea utilizando una cláusula New, como se muestra en el ejemplo siguiente.

cargoWeights = New Double(10) {}
atmospherePressures = New Short(2, 2, 4, 10) {}
inquiriesByYearMonthDay = New Byte(20)()() {}

Si se tiene una matriz existente, se puede volver a definir su tamaño utilizando la instrucción Redim. Se puede especificar que la instrucción Redim mantenga los valores almacenados actualmente en la matriz o que cree una nueva matriz vacía. En el ejemplo siguiente se muestran usos diferentes de la instrucción Redim para modificar el tamaño de una matriz existente.

' Assign a new array size and retain the current element values.
ReDim Preserve cargoWeights(20)
' Assign a new array size and retain only the first five element values.
ReDim Preserve cargoWeights(4)
' Assign a new array size and discard all current element values.
ReDim cargoWeights(15)

Para obtener más información, vea Instrucción ReDim (Visual Basic).

Rellenar una matriz con valores iniciales

Se puede crear una matriz que contenga un conjunto inicial de valores utilizando un literal de matriz. Un literal de matriz está formado por una lista de valores separados por comas que se encierran entre llaves ({}).

Cuando se crea una matriz utilizando un literal de matriz, se puede proporcionar el tipo de la matriz o usar la inferencia de tipos para determinarlo. Ambas opciones se muestran en el código siguiente.

Dim numbers = New Integer() {1, 2, 4, 8}
Dim doubles = {1.5, 2, 9.9, 18}

Cuando se utiliza la inferencia de tipos, el tipo de la matriz lo determina el tipo dominante en la lista de valores que se proporciona para el literal de matriz. El tipo dominante es un tipo único al que todos los demás tipos en el literal de matriz se pueden ampliar. Si no se puede determinar este tipo único, el tipo dominante es el tipo único al que todos los demás tipos de la matriz se pueden restringir. Si no se puede determinar ninguno de estos tipos únicos, el tipo dominante es Object. Por ejemplo, si la lista de valores proporcionada al literal de matriz contiene valores de tipo Integer, Long y Double, la matriz resultante es de tipo Double. Tanto Integer como Long se amplían a Double y sólo Double. Por consiguiente, Double es el tipo dominante. Para obtener más información, vea Conversiones de ampliación y de restricción (Visual Basic). Estas reglas de inferencia se aplican a tipos deducidos para matrices que son variables locales definidas en un miembro de clase. Aunque se pueden utilizar literales de matriz al crear variables de nivel de clase, no se puede usar la inferencia de tipos en el nivel de clase. Como resultado, los literales de matriz que se especifican en el nivel de clase deducen los valores proporcionados para el literal de matriz como tipo Object.

Se puede especificar explícitamente el tipo de los elementos de una matriz que se crea utilizando un literal de matriz. En este caso, los valores del literal de matriz se deben ampliar al tipo de los elementos de la matriz. En el ejemplo de código siguiente se crea una matriz de tipo Double a partir de una lista de enteros.

Dim values As Double() = {1, 2, 3, 4, 5, 6}

Literales de matriz anidados

Se puede crear una matriz multidimensional utilizando los literales de matriz anidados. Los literales de matriz anidados deben tener una dimensión y un número de dimensiones, o rango, que sea coherente con la matriz resultante. En el ejemplo de código siguiente se crea una matriz bidimensional de enteros utilizando un literal de matriz.

Dim grid = {{1, 2}, {3, 4}}

En el ejemplo anterior, se produciría un error si el número de elementos en los literales de matriz anidados no coincidiese. También se produciría un error si se declarase explícitamente que la variable de la matriz no es bidimensional.

Nota

Para evitar que se produzca un error al proporcionar literales de matriz anidados de dimensiones diferentes, se deben encerrar entre paréntesis los literales de matriz internos. Los paréntesis exigen la evaluación de la expresión literal de matriz y los valores resultantes se utilizan con el literal de matriz externo. Esto se muestra en el código siguiente.

Dim values = {({1, 2}), ({3, 4, 5})}

Cuando se crea una matriz multidimensional utilizando literales de matriz anidados, se puede utilizar la inferencia de tipos. Cuando se utiliza la inferencia de tipos, el tipo deducido es el tipo dominante para todos los valores de todos los literales de matriz en un nivel de anidamiento. En el ejemplo de código siguiente, se crea una matriz bidimensional de tipo Double a partir de valores que son de tipo Integer y Double.

Dim a = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}

Para obtener otros ejemplos, vea Cómo: Inicializar variables de matriz en Visual Basic.

Almacenar valores en una matriz

Se puede tener acceso a cada ubicación en una matriz utilizando un índice de tipo Integer. Se pueden almacenar y recuperar valores en una matriz haciendo referencia a cada ubicación de la matriz utilizando su índice entre paréntesis. Los índices de matrices multidimensionales se separan mediante comas (,). Se necesita un índice para cada dimensión de matriz. El ejemplo siguiente muestra algunas instrucciones que almacenan valores en matrices.

Dim i = 4
Dim j = 2

Dim numbers(10) As Integer
Dim matrix(5, 5) As Double

numbers(i + 1) = 0
matrix(3, j * 2) = j

El ejemplo siguiente muestra algunas instrucciones que reciben valores de las matrices.

Dim v = 2
Dim i = 1
Dim j = 1
Dim k = 1
Dim wTotal As Double = 0.0
Dim sortedValues(5), rawValues(5), estimates(2, 2, 2) As Double
Dim lowestValue = sortedValues(0)
wTotal += (rawValues(v) ^ 2)
Dim firstGuess = estimates(i, j, k)

Para cada dimensión de la matriz, el método GetUpperBound devuelve el valor máximo que puede tener el índice. El valor de índice mínimo es siempre 0.

Tamaño de una matriz

El tamaño de una matriz es el producto de las longitudes de todas sus dimensiones. Representa el número total de elementos contenido actualmente en la matriz.

A continuación, se muestra un ejemplo de declaración de una matriz tridimensional.

Dim prices(3, 4, 5) As Long

El tamaño total de la matriz en la variable prices es (3 + 1) x (4 + 1) x (5 + 1) = 120.

Se puede buscar el tamaño de una matriz utilizando la propiedad Length. Se puede encontrar la longitud de cada dimensión de una matriz multidimensional utilizando el método GetLength.

Se puede cambiar el tamaño de una variable de matriz asignándole un nuevo objeto de matriz o utilizando la instrucción ReDim.

Se deben tener presentes varias cosas cuando se trata con el tamaño de una matriz.

Longitud de la dimensión

El índice de cada dimensión está basado en 0, lo que significa que va desde 0 hasta su límite superior. Por consiguiente, la longitud de una dimensión determinada supera en 1 al límite superior declarado para esa dimensión.

Límites de longitud

La longitud de cada dimensión de una matriz está limitada al valor máximo del tipo de datos Integer que es (2 ^ 31) - 1. No obstante, la memoria disponible en el sistema limita también el tamaño total de una matriz. Si intenta inicializar una matriz que supera la cantidad de memoria RAM disponible, Common Language Runtime produce una excepción OutOfMemoryException.

Tamaño y tamaño de elementos

El tamaño de una matriz es independiente del tipo de datos de sus elementos. El tamaño siempre representa el número total de elementos, no el número de bytes que utilizan en el almacenamiento.

Consumo de memoria

No es seguro dar nada por supuesto en lo que respecta al modo de almacenar una matriz en la memoria. El almacenamiento varía en función de las plataformas de diferentes anchos de datos, por lo que la misma matriz puede utilizar más memoria en un sistema de 64 bits que en un sistema de 32 bits. Según la configuración del sistema cuando inicializa una matriz, Common Language Runtime (CLR) puede asignar el almacenamiento para empaquetar los elementos tan juntos como sea posible o para alinearlos todos en los límites naturales del hardware. Asimismo, una matriz requiere una sobrecarga de almacenamiento para obtener su información de control y esta sobrecarga aumenta con cada dimensión agregada.

Tipos de matriz y otros tipos

Tipos de datos

Cada matriz tiene un tipo de datos, pero difiere del tipo de datos de sus elementos. No existe ningún tipo de datos para todas las matrices. En su lugar, el tipo de datos de una matriz lo determina el número de dimensiones, o rango, de la matriz y el tipo de datos de los elementos de la matriz. Se considera que dos variables de matriz son del mismo tipo de datos sólo cuando tienen el mismo rango y sus elementos tienen el mismo tipo de datos. Las longitudes de las dimensiones de una matriz no influyen en el tipo de datos de la matriz.

Cada matriz hereda de la clase System.Array y puede declarar una variable que sea de tipo Array pero no puede crear una matriz de tipo Array. Asimismo, Instrucción ReDim (Visual Basic) no puede funcionar en una variable declarada de tipo Array. Por estas razones y para mayor seguridad del tipo, es aconsejable declarar cada matriz como un tipo específico, como por ejemplo Integer en el ejemplo anterior.

Puede averiguar el tipo de datos de una matriz o de sus elementos de varias maneras.

  • Llame al método Object.GetType en la variable a fin de recibir un objeto Type para el tipo en tiempo de ejecución de la variable. El objeto Type contiene amplia información en sus propiedades y métodos.

  • Pase la variable a la función TypeName para recibir un objeto String que contenga el nombre del tipo en tiempo de ejecución.

  • Pase la variable a la función VarType para recibir un valor VariantType que represente la clasificación de tipo de la variable.

En el ejemplo siguiente se llama a la función TypeName para determinar el tipo de la matriz y el tipo de los elementos de la matriz. El tipo de la matriz es Integer(,) y el tipo de los elementos de la matriz es Integer.

Dim thisTwoDimArray(,) As Integer = New Integer(9, 9) {}
MsgBox("Type of thisTwoDimArray is " & TypeName(thisTwoDimArray))
MsgBox("Type of thisTwoDimArray(0, 0) is " & TypeName(thisTwoDimArray(0, 0)))

Colecciones como alternativa a las matrices

Aunque las colecciones se suelen utilizar para trabajar con Object (Tipo de datos), también se pueden usar para trabajar con cualquier tipo de datos. En algunas circunstancias, puede resultar más eficaz almacenar elementos en una colección que en una matriz.

Si necesita cambiar el tamaño de una matriz, debe utilizar Instrucción ReDim (Visual Basic). Si hace esto, Visual Basic crea una nueva matriz y libera la matriz anterior para su eliminación. Esto requiere tiempo de ejecución. Por consiguiente, si el número de elementos con los que trabaja cambia a menudo o no puede predecir el número máximo de elementos que necesita, puede obtener un mejor rendimiento utilizando una colección.

Una colección, que no tiene que crear un nuevo objeto o copiar elementos existentes, puede controlar el cambio de tamaño en un tiempo de ejecución menor que una matriz, que tiene que utilizar ReDim. Pero si el tamaño no cambia, o sólo cambia raramente, es probable que una matriz sea más eficaz. Como siempre, el rendimiento depende en gran medida de la aplicación individual. Suele merecer la pena probar una matriz y una colección.

Colecciones especializadas

.NET Framework también proporciona una variedad de clases, interfaces y estructuras para colecciones generales y especiales. Los espacios de nombres System.Collections y System.Collections.Specialized contienen las definiciones e implementaciones que incluyen diccionarios, listas, colas y pilas. El espacio de nombres System.Collections.Generic proporciona muchos de ellos en versiones genéricas que adoptan uno o más argumentos de tipos.

Si su colección es para contener elementos de sólo un tipo de datos concreto, una colección genérica tiene la ventaja de forzar la seguridad de tipos. Para obtener más información sobre genéricos, vea Tipos genéricos en Visual Basic (Visual Basic).

Colecciones especializadas

.NET Framework también proporciona una variedad de clases, interfaces y estructuras para colecciones generales y especiales. Los espacios de nombres System.Collections y System.Collections.Specialized contienen las definiciones e implementaciones que incluyen diccionarios, listas, colas y pilas. El espacio de nombres System.Collections.Generic proporciona muchos de ellos en versiones genéricas que adoptan uno o más argumentos de tipos.

Si su colección es para contener elementos de sólo un tipo de datos concreto, una colección genérica tiene la ventaja de forzar la seguridad de tipos. Para obtener más información sobre genéricos, vea Tipos genéricos en Visual Basic (Visual Basic).

Ejemplo

En el ejemplo siguiente se utiliza la clase genérica System.Collections.Generic.List<T> de .NET Framework para crear una colección de listas de objetos Customer.

' Define the class for a customer.
Public Class Customer
    Public Property Name As String
    ' Insert code for other members of customer structure.
End Class

' Create a module-level collection that can hold 200 elements.
Public CustomerList As New List(Of Customer)(200)

' Add a specified customer to the collection.
Private Sub AddNewCustomer(ByVal newCust As Customer)
    ' Insert code to perform validity check on newCust.
    CustomerList.Add(newCust)
End Sub

' Display the list of customers in the Debug window.
Private Sub PrintCustomers()
    For Each cust As Customer In CustomerList
        Debug.WriteLine(cust)
    Next cust
End Sub

La declaración de la colección CustomerFile especifica que sólo puede contener elementos de tipo Customer. También proporciona una capacidad inicial de 200 elementos. El procedimiento AddNewCustomer comprueba la validez del nuevo elemento y, a continuación, lo agrega a la colección. El procedimiento PrintCustomers utiliza un bucle For Each para recorrer la colección y mostrar sus elementos.

Temas relacionados

Término

Definición

Dimensiones de matrices en Visual Basic

Explica el rango y las dimensiones de las matrices.

Cómo: Inicializar variables de matriz en Visual Basic

Describe cómo se rellenan las matrices con valores iniciales.

Cómo: Invertir el contenido de una matriz en Visual Basic

Describe cómo invertir el orden de los elementos de una matriz.

Cómo: Ordenar una matriz en Visual Basic

Muestra cómo ordenar alfabéticamente los elementos de una matriz.

Cómo: Asignar una matriz a otra (Visual Basic)

Describe las reglas y pasos para asignar una matriz a otra variable de matriz.

Cómo: Cambiar una matriz por otra distinta (Visual Basic)

Explica qué cambios son posibles y cómo lograrlos.

Cómo: Pasar una matriz a un procedimiento o una propiedad (Visual Basic)

Explica cómo pasar una matriz como un argumento a un procedimiento o propiedad.

Cómo: Devolver una matriz desde un procedimiento o una propiedad (Visual Basic)

Describe cómo devolver una matriz al código que llama a un procedimiento o propiedad.

Solucionar problemas de matrices (Visual Basic)

Describe algunos problemas comunes que surgen al trabajar con matrices.

Vea también

Referencia

Instrucción Dim (Visual Basic)

Instrucción ReDim (Visual Basic)

Array