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.

Mediante una matriz, puede hacer referencia a estos valores relacionados con el mismo nombre, y utiliza un número que se denomina un índice o subíndice para distinguirlos.Los valores individuales se llaman elementos de la matriz.Contiguos desde el índice 0 hasta el valor de índice superior.

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

En este tema

  • Elementos de la matriz en una matriz de Simple

  • Crear una matriz

  • Declarar una matriz

  • Almacenar valores en una matriz

  • Rellenar una matriz con valores iniciales

    • Literales de matriz anidados
  • Itera a través de una matriz

  • Matrices como valores devueltos y parámetros

  • Matrices escalonadas

  • Matrices de longitud cero

  • Tamaño de una matriz

  • Tipos de matriz y otros tipos

  • Colecciones como alternativa a las matrices

Elementos de la matriz en una matriz de Simple

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 siete elementos.Los índices de los elementos van de 0 a 6.Tener esta matriz es más fácil que declarar siete variables.

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.

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

Crear una matriz

Puede definir el tamaño de una matriz de varias maneras.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 puede utilizar una cláusula de New para proporcionar el tamaño de una matriz cuando ha creado, 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.Puede especificar que la instrucción de Redim debe mantener los valores que están en la matriz, o que cree una 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).

Declarar una matriz

Una variable de matriz se declara de la misma manera que cualquier otra variable mediante la instrucción Dim.Sigue el tipo o el nombre de variable con uno o más pares de paréntesis para indicar que contenga una matriz en lugar de un escalar, que es una variable que contiene un único valor.

Después de declarar la matriz, puede definir su tamaño utilizando Instrucción ReDim (Visual Basic).

El ejemplo siguiente declara una variable de matriz unidimensional agregando un par de paréntesis después del tipo.El ejemplo también se especifica las dimensiones de la matriz utilizando Instrucción ReDim (Visual Basic).

' Declare a one-dimensional array.
Dim cargoWeights As Double()

' Dimension the array.
ReDim cargoWeights(15)

El ejemplo siguiente declara una variable de matriz multidimensional agregando un par de paréntesis después del tipo y colocando comas entre paréntesis para separar las dimensiones.El ejemplo también se especifica las dimensiones de la matriz utilizando Instrucción ReDim (Visual Basic).

' Declare a multidimensional array.
Dim atmospherePressures As Short(,,,)

' Dimension the array.
ReDim atmospherePressures(1, 2, 3, 4)

Para declarar una variable de matriz escalonada, agregue un par de paréntesis después del nombre de la variable para cada nivel de matriz anidados.

Dim inquiriesByYearMonthDay()()() As Byte

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

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 están separados por comas (,).Se necesita un índice para cada dimensión de la 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)

Rellenar una matriz con valores iniciales

Utilizando un literal de matriz, puede crear una matriz que contiene un conjunto inicial de valores.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.El código siguiente muestra ambas opciones.

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 dominante determina el tipo de matriz 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 del literal de matriz se pueden ampliar.Si no se puede determinar este tipo único, el tipo dominante es el tipo único al que 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 que se proporciona al literal de matriz contiene valores de Integer con tipo, de Long, y de Double, la matriz resultante es de Double escrito.Integer y Long amplían sólo a 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 los tipos que se infieren para las matrices que son variables locales que se definen en un miembro de clase.Aunque puede utilizar literales de matriz al crear variables de nivel de clase, no puede utilizar 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 que se proporcionan para el literal de matriz como Object escrito.

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}

wak0wfyt.collapse_all(es-es,VS.110).gifLiterales 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 es 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 no coincide con el número de elementos en los literales de matriz anidados.También se produciría un error si se explícitamente que la variable de matriz para estar distinto de 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 fuerzan la expresión literal de matriz que se evaluará, y los valores resultantes se utilizan con el literal de matriz externo, como muestra 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 una variable de matriz en Visual Basic.

Itera a través de una matriz

Cuando se recorre en iteración una matriz, tiene acceso a cada elemento de la matriz de índice mínimo al índice más alto.

El ejemplo siguiente se recorre en iteración una matriz unidimensional con Instrucción For...Next (Visual Basic).El método de GetUpperBound devuelve el valor máximo que puede tener el índice.El valor de índice mínimo es siempre 0.

Dim numbers = {10, 20, 30}

For index = 0 To numbers.GetUpperBound(0)
    Debug.WriteLine(numbers(index))
Next
' Output:
'  10
'  20
'  30

El ejemplo siguiente se recorre en iteración una matriz multidimensional utilizando una instrucción de For...Next.El método de GetUpperBound tiene un parámetro que especifica la dimensión.GetUpperBound(0) devuelve el alto valor de índice de la primera dimensión, y GetUpperBound(1) devuelve el alto valor de índice de la segunda dimensión.

Dim numbers = {{1, 2}, {3, 4}, {5, 6}}

For index0 = 0 To numbers.GetUpperBound(0)
    For index1 = 0 To numbers.GetUpperBound(1)
        Debug.Write(numbers(index0, index1).ToString & " ")
    Next
    Debug.WriteLine("")
Next
' Output 
'  1 2 
'  3 4 
'  5 6

El ejemplo siguiente se recorre en iteración una matriz unidimensional mediante Instrucción For Each...Next (Visual Basic).

Dim numbers = {10, 20, 30}

For Each number In numbers
    Debug.WriteLine(number)
Next
' Output:
'  10
'  20
'  30

El ejemplo siguiente se recorre en iteración una matriz multidimensional utilizando una instrucción de For Each...Next.Sin embargo, tiene más control sobre los elementos de una matriz multidimensional si utiliza una instrucción anidada de For…Next, como en un ejemplo anterior, en lugar de una instrucción de For Each…Next.

Dim numbers = {{1, 2}, {3, 4}, {5, 6}}

For Each number In numbers
    Debug.WriteLine(number)
Next
' Output:
'  1
'  2
'  3
'  4
'  5
'  6

Matrices como valores devueltos y parámetros

Para devolver una matriz de un procedimiento de Function, especifique el tipo de datos de la matriz y el número de dimensiones como tipo de valor devuelto de Function (Instrucción, Visual Basic).Dentro de la función, declare una variable de matriz local con el mismo tipo de datos y dimensiones.En Return (Instrucción, Visual Basic), incluya la variable de matriz local sin paréntesis.

Para especificar una matriz como parámetro a un procedimiento de Sub o de Function, defina el parámetro como matriz con un tipo de datos y un número especificado de dimensiones.En la llamada al procedimiento, envíe una variable de matriz con el mismo tipo de datos y dimensiones.

En el ejemplo siguiente, la función de GetNumbers devuelve Integer().Este tipo de matriz es una matriz unidimensional de Integer escrito.El procedimiento de ShowNumbers acepta un argumento de Integer().

Public Sub Process()
    Dim numbers As Integer() = GetNumbers()
    ShowNumbers(numbers)
End Sub

Private Function GetNumbers() As Integer()
    Dim numbers As Integer() = {10, 20, 30}
    Return numbers
End Function

Private Sub ShowNumbers(numbers As Integer())
    For index = 0 To numbers.GetUpperBound(0)
        Debug.WriteLine(numbers(index) & " ")
    Next
End Sub

' Output:
'   10
'   20
'   30

En el ejemplo siguiente, la función de GetNumbersMultiDim devuelve Integer(,).Este tipo de matriz es una matriz bidimensional de Integer escrito.El procedimiento de ShowNumbersMultiDim acepta un argumento de Integer(,).

Public Sub ProcessMultidim()
    Dim numbers As Integer(,) = GetNumbersMultidim()
    ShowNumbersMultidim(numbers)
End Sub

Private Function GetNumbersMultidim() As Integer(,)
    Dim numbers As Integer(,) = {{1, 2}, {3, 4}, {5, 6}}
    Return numbers
End Function

Private Sub ShowNumbersMultidim(numbers As Integer(,))
    For index0 = 0 To numbers.GetUpperBound(0)
        For index1 = 0 To numbers.GetUpperBound(1)
            Debug.Write(numbers(index0, index1).ToString & " ")
        Next
        Debug.WriteLine("")
    Next
End Sub

' Output  
'  1 2  
'  3 4  
'  5 6

Matrices escalonadas

Una matriz que contiene otras matrices mientras que los elementos se conocen como una matriz de matrices o una matriz escalonada.Una matriz escalonada y cada elemento de una matriz escalonada pueden tener una o más dimensiones.En algunas ocasiones, la estructura de datos de la aplicación es bidimensional pero no rectangular.

El ejemplo siguiente tiene una matriz de meses, cada elemento cuyo es una matriz de días.Dado que los distintos meses tienen un número de días, los elementos no forman una matriz bidimensional rectangular.Por consiguiente, una matriz escalonada se utiliza en lugar de una matriz multidimensional.

' Declare the jagged array.
' The New clause sets the array variable to a 12-element
' array. Each element is an array of Double elements.
Dim sales()() As Double = New Double(11)() {}

' Set each element of the sales array to a Double
' array of the appropriate size.
For month As Integer = 0 To 11
    Dim days As Integer =
        DateTime.DaysInMonth(Year(Now), month + 1)
    sales(month) = New Double(days - 1) {}
Next month

' Store values in each element.
For month As Integer = 0 To 11
    Dim upper = sales(month).GetUpperBound(0)
    For day = 0 To upper
        sales(month)(day) = (month * 100) + day
    Next
Next

Matrices de longitud cero

Una matriz que no contiene ningún elemento también se denomina matriz de la cero- longitud.Una variable que contiene una matriz de la cero- longitud no tiene el valor Nothing.Para crear una matriz que no tenga elementos, declare 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:

  • Sin arriesgar una excepción de NullReferenceException, el código debe tener acceso a los miembros de la clase de Array, como Length o Rank, o llame a una función de Visual Basic como UBound.

  • 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 exijan pasar una matriz de la cero- longitud a uno o más procedimientos o devuelve una matriz de la cero- longitud de uno o más procedimientos.

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

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

Las matrices son muy útiles para crear y trabajar con un número fijo de objetos fuertemente tipados.Las colecciones proporcionan un método más flexible para trabajar con grupos de objetos.A diferencia de las matrices, el grupo de objetos que trabaje con puede crece y reducirse dinámicamente a medida que cambian las necesidades de la aplicación.

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.

Para algunas colecciones, puede asignar una clave a cualquier objeto que incluya en la colección para que pueda recuperar rápidamente el objeto con la clave asignada.

Si su colección se limita a elementos de sólo un tipo de datos, puede utilizar una de las clases en el espacio de nombres System.Collections.Generic.Una colección genérica cumple la seguridad de tipos para que ningún otro tipo de datos se pueda agregar a ella.Cuando recupera un elemento de una colección genérica, no tiene que determinar su tipo de datos ni convertirlo.

Para obtener más información sobre las colecciones, vea Colecciones (C# y Visual Basic).

wak0wfyt.collapse_all(es-es,VS.110).gifEjemplo

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 una variable de matriz en Visual Basic

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

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.

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