Matrizes no Visual Basic
Uma matriz é um conjunto de valores que são logicamente relacionados uns aos outros, como o número de alunos em cada classificação em uma escola secundária.
Usando uma matriz, você pode consultar esses valores relacionados pelo mesmo nome, e usar um número que é chamado índice ou subscript para deixá-los separados. Os valores individuais são chamados de elementos da matriz. Eles são contíguos do índice 0 até o valor de índice mais alto.
Em contraste com uma matriz, uma variável que contém um único valor é chamada de uma variável escalar.
Neste tópico
Elementos da matriz em uma matriz simples
Criando uma matriz
Declarando uma matriz
Armazenando valores em uma matriz
Preenchendo uma matriz com valores iniciais
- Literais de matriz aninhadas
Percorrer uma matriz
Matrizes como valores de retorno e parâmetros
Matrizes denteadas
Matrizes de comprimento zero
Tamanho da matriz
Tipos de matriz e outros tipos
Coleções como uma alternativa para matrizes
Elementos da matriz em uma matriz simples
O exemplo a seguir declara uma variável de matriz para manter o número de alunos em cada classificação em uma escola secundária.
Dim students(6) As Integer
A matriz students no exemplo anterior contém sete elementos. Os índices dos elementos variam de 0 a 6. Ter essa matriz é mais simples de que declarar sete variáveis.
A ilustração a seguir mostra a matriz students. Para cada elemento da matriz:
O índice do elemento representa a classificação (o índice 0 representa o jardim de infância).
O valor que está contido no elemento representa o número de alunos nessa classificação.
Elementos da matriz "alunos"
O exemplo a seguir mostra como fazer referência ao primeiro, segundo e último elemento da 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))
Você pode referir à matriz no dataset usando apenas o nome da variável de matriz sem índices.
A matriz students no exemplo anterior usa um índice e é unidimensional. Uma matriz que usa mais de um indexador ou subscrito é chamada de multidimensional. Para obter mais informações, consulte o restante deste tópico e Dimensões de matriz no Visual Basic.
Criando uma matriz
Você pode definir o tamanho de uma matriz várias maneiras. Você pode fornecer o tamanho quando a matriz é declarada, como mostra o exemplo a seguir.
Dim cargoWeights(10) As Double
Dim atmospherePressures(2, 2, 4, 10) As Short
Dim inquiriesByYearMonthDay(20)()() As Byte
Você também pode usar uma cláusula de New para fornecer o tamanho de uma matriz quando ela é criada, como mostra o exemplo a seguir.
cargoWeights = New Double(10) {}
atmospherePressures = New Short(2, 2, 4, 10) {}
inquiriesByYearMonthDay = New Byte(20)()() {}
Se você tiver uma matriz existente, poderá redefinir seu tamanho usando a instrução Redim . Você pode especificar que a declaração de Redim deve manter os valores que estão na matriz, ou pode especificar que cria uma matriz vazia. O exemplo a seguir mostra usos diferentes da instrução Redim para modificar o tamanho de uma 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 obter mais informações, consulte Instrução ReDim (Visual Basic).
Declarando uma matriz
Você declara uma variável de matriz da mesma maneira que qualquer outra variável, usando a instrução de Dim . Você segue o tipo ou o nome de variável com um ou mais pares de parênteses para indicar que conterá uma matriz em vez de uma escalar, que é uma variável que contém um único valor.
Após você declarar a matriz, será possível definir seu tamanho usando Instrução ReDim (Visual Basic).
O exemplo a seguir declara uma variável de matriz unidimensional adicionando um par de parênteses após o tipo. O exemplo também especifica as dimensões da matriz usando o Instrução ReDim (Visual Basic).
' Declare a one-dimensional array.
Dim cargoWeights As Double()
' Dimension the array.
ReDim cargoWeights(15)
O exemplo a seguir declara uma variável de matriz multidimensional adicionando um par de parênteses após o tipo e colocando vírgulas dentro dos parênteses para separar as dimensões. O exemplo também especifica as dimensões da matriz usando o Instrução ReDim (Visual Basic).
' Declare a multidimensional array.
Dim atmospherePressures As Short(,,,)
' Dimension the array.
ReDim atmospherePressures(1, 2, 3, 4)
Para declarar uma variável de matriz denteada, adicione um par de parênteses após o nome de variável para cada nível de matriz aninhada.
Dim inquiriesByYearMonthDay()()() As Byte
Os exemplos anteriores declaram as variáveis de matriz, mas não atribuem matrizes a elas. Você ainda deve criar uma matriz, inicializar, e a atribuir para variável.
Armazenando valores em uma matriz
Você pode acessar cada local em uma matriz usando um índice do tipo Integer. Você pode armazenar e recuperar valores em uma matriz referenciando cada local de matriz usando o índice entre parênteses. Os índices para matrizes de várias dimensões são separados por vírgulas (,). Você precisa de um índice para cada dimensão de matriz. O exemplo a seguir mostra algumas declarações que armazenam valores em matrizes.
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
O exemplo a seguir mostra algumas declarações que obtêm valores de matrizes.
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)
Preenchendo uma matriz com valores iniciais
Ao usar um literal de matriz, você pode criar uma matriz que contém um conjunto inicial de valores. Um literal de matriz consiste em uma lista de valores separados por vírgulas que são colocados entre chaves ({}).
Quando você cria uma matriz usando um literal de matriz, você pode fornecer um tipo de matriz ou usar inferência de tipos para determinar o tipo de matriz. O código a seguir mostra ambas opções.
Dim numbers = New Integer() {1, 2, 4, 8}
Dim doubles = {1.5, 2, 9.9, 18}
Ao usar inferência de tipos, o tipo da matriz é determinado pelo tipo dominante na lista de valores que é fornecida para o literal de matriz. O tipo dominante é exclusivo para o qual outros tipos no literal de matriz podem se expandir. Se esse tipo exclusivo não puder ser determinado, o tipo dominante será o tipo exclusivo para o qual todos os tipos na matriz poderão se restringir. Se nenhum desses tipos exclusivos puder ser determinado, o tipo dominante será Object. Por exemplo, se a lista de valores fornecida para o literal de matriz contiver valores do tipo Integer, Long e Double, a matriz resultante será do tipo Double. Integer e Long amplia somente a Double. Portanto, Double é o tipo dominante. Para obter mais informações, consulte Conversões de Widening e Narrowing (Visual Basic). Essas regras de inferência se aplicam aos tipos que são inferidos para matrizes que são variáveis locais definidas em um membro da classe. Embora você possa usar literais de matriz ao criar variáveis a nível de classe, você não pode usar inferência de tipos no nível de classe. Como resultado, os literais de matriz que são especificados em nível de classe inferem nos valores que são fornecidos para a literal de matriz, como o tipo Object.
Você pode especificar explicitamente o tipo dos elementos em uma matriz que é criada usando um literal de matriz. Nesse caso, os valores no literal de matriz devem ser ampliados para o tipo dos elementos da matriz. O exemplo de código a seguir cria uma matriz do tipo Double a partir de uma lista de inteiros.
Dim values As Double() = {1, 2, 3, 4, 5, 6}
Literais de matriz aninhadas
Você pode criar uma matriz multidimensional usando literais de matriz aninhados. Os literais de matriz aninhados devem ter uma dimensão e número de dimensões, ou classificação, que seja consistente com a matriz resultante. O exemplo de código a seguir cria uma matriz bidimensional de inteiros usando um literal de matriz.
Dim grid = {{1, 2}, {3, 4}}
No exemplo anterior, um erro poderia ocorrer se o número de elementos nos literais da matriz aninhada não correspondesse. Um erro também ocorreria se você declarasse explicitamente a variável de matriz como sendo diferente de bidimensional.
Dica
Você pode evitar um erro ao fornecer literais de matriz aninhados de diferentes dimensões, incluindo os literais de matriz internos entre parênteses.Os parênteses forçam a avaliação da expressão literal de matriz, e os valores resultantes são usados com o literal de matriz externo, como mostra o código a seguir.
Dim values = {({1, 2}), ({3, 4, 5})}
Quando você cria uma matriz multidimensional usando literais de matriz aninhados, você pode usar inferência de tipos. Ao usar inferência de tipos, o tipo inferido é o tipo dominante para todos os valores em todos os literais de matriz para um nível de aninhamento. O exemplo de código a seguir cria uma matriz bidimensional do tipo Double dos valores que são do tipo Integer e Double.
Dim a = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}
Para exemplos adicionais, consulte Como inicializar uma variável de matriz no Visual Basic.
Percorrer uma matriz
Quando você percorre através de uma matriz, você acessa cada elemento do menor índice para o maior.
O exemplo a seguir efetua iterações por meio de uma matriz unidimensional usando Instrução For...Next (Visual Basic). O método GetUpperBound retorna o valor mais alto que o índice pode ter. O menor valor de índice é sempre 0.
Dim numbers = {10, 20, 30}
For index = 0 To numbers.GetUpperBound(0)
Debug.WriteLine(numbers(index))
Next
' Output:
' 10
' 20
' 30
O exemplo a seguir efetua iterações por meio de uma matriz multidimensional usando uma declaração For...Next. O método GetUpperBound tem um parâmetro que especifica a dimensão. GetUpperBound(0) retorna o valor de índice alto para a primeira dimensão e GetUpperBound(1) retorna o valor de índice alto para a segunda dimensão.
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
O exemplo a seguir efetua iterações por meio de uma matriz unidimensional usando um Instrução For Each...Next (Visual Basic).
Dim numbers = {10, 20, 30}
For Each number In numbers
Debug.WriteLine(number)
Next
' Output:
' 10
' 20
' 30
O exemplo a seguir efetua iterações por meio de uma matriz multidimensional usando uma declaração For Each...Next. No entanto, você terá mais controle sobre os elementos de uma matriz multidimensional se usar uma instrução aninhada For…Next, como no exemplo anterior, em vez de uma instrução 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
Matrizes como valores de retorno e parâmetros
Para retornar uma matriz de um procedimento Function, especifique o tipo de dados de matriz e o número de dimensões como o tipo de retorno de Instrução Function (Visual Basic). Dentro da função, declare uma variável de matriz local com o mesmo tipo de dado e número de dimensões. Em Instrução Return (Visual Basic), inclua a variável de matriz local sem parênteses.
Para especificar uma matriz como um parâmetro para um procedimento Sub ou Function, defina o parâmetro como uma matriz com um tipo de dados e um número de dimensões especificados. Na chamada ao procedimento, envie uma variável de matriz com o mesmo tipo de dados e número de dimensões.
No exemplo a seguir, a função de GetNumbers retorna um Integer(). Esse tipo de matriz é uma matriz unidimensional do tipo Integer. O procedimento de ShowNumbers aceita um 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
No exemplo a seguir, a função de GetNumbersMultiDim retorna um Integer(,). Esse tipo de matriz é uma matriz bidimensional do tipo Integer. O procedimento de ShowNumbersMultiDim aceita um 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
Matrizes denteadas
Uma matriz que contém outras matrizes como elementos é conhecida como uma matriz de matrizes ou uma matriz denteada. Uma matriz denteada e cada elemento em uma matriz denteada podem ter uma ou mais dimensões. Às vezes, a estrutura de dados no seu aplicativo é bidimensional, mas não retangular.
O exemplo a seguir possui uma matriz de meses, da qual cada elemento é uma matriz de dias. Como diferentes meses têm diferentes números de dias, os elementos não formam uma matriz bidimensional retangular. Portanto, uma matriz denteada é usada, em vez de uma 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
Matrizes de comprimento zero
Uma matriz que não contém nenhum elemento também é chamada de matriz de comprimento zero. Uma variável que contém um array de comprimento zero não tem o valor Nothing. Para criar uma matriz que não tenha nenhum elemento, declare uma das dimensões da matriz para ser -1, como mostra o exemplo a seguir.
Dim twoDimensionalStrings(-1, 3) As String
Talvez você precise criar uma matriz de comprimento zero nas seguintes circunstâncias:
Sem o risco de uma exceção NullReferenceException, seu código deve acessar os membros da classe Array, Length ou Rank, ou chamar uma função Visual Basic, como UBound.
Você deseja manter o código mais simples por não precisa procurar por Nothing como um caso especial.
Seu código interage com um interface de programação de aplicativo (API) que exige que você passe uma matriz de comprimento zero para um ou mais procedimentos, ou que retorna uma matriz de comprimento zero de um ou mais procedimentos.
Tamanho da matriz
O tamanho de uma matriz é o produto dos comprimentos de todas as suas dimensões. Representa o número total de elementos atualmente contidos na matriz.
O exemplo a seguir declara uma matriz tridimensional.
Dim prices(3, 4, 5) As Long
O tamanho total da matriz na variável prices é (3 + 1) x (4 + 1) x (5 + 1) = 120.
Você pode encontrar o tamanho de uma matriz usando a propriedade de Length . Você pode localizar o comprimento de cada dimensão de uma matriz de dimensional usando o método GetLength .
Você pode redimensionar uma variável de matriz atribuindo um novo objeto de matriz a ela ou usando a instrução de ReDim .
Há várias coisas para ter em mente ao lidar com o tamanho de uma matriz.
Comprimento de dimensão |
O índice de cada dimensão tem base 0, o que significa que ele varia de 0 até seu limite superior. Portanto, o comprimento de uma determinada dimensão é 1 vez maior que o limite superior declarado para essa dimensão. |
Limites de comprimento |
O comprimento de cada dimensão de uma matriz é limitado ao valor máximo do tipo de dados Integer, que é (2 ^ 31) - 1. No entanto, o tamanho total de uma matriz também é limitado pela memória disponível no seu sistema. Se você tentar inicializar uma matriz que exceda a quantidade de RAM disponível, o Common Language Runtime gerará uma exceção OutOfMemoryException. |
Tamanho e tamanho do elemento |
O tamanho de uma matriz é independente do tipo de dados de seus elementos. O tamanho sempre representa o número total de elementos, e não o número de bytes que consomem no armazenamento. |
Consumo de memória |
Não é seguro fazer qualquer suposição sobre como uma matriz é armazenada na memória. O armazenamento varia em plataformas de larguras de dados diferentes para que a mesma matriz possa consumir mais memória em um sistema de 64 bits do que em um sistema de 32 bits. Dependendo da configuração do sistema quando você inicializa uma matriz, o Common Language Runtime (CLR) pode atribuir armazenamento para empacotar elementos o mais próximos possível ou para alinhar todos eles em limites de hardware naturais. Além disso, uma matriz requer uma sobrecarga de armazenamento para suas informações de controle, e essa sobrecarga aumenta com cada dimensão adicionada. |
Tipos de matriz e outros tipos
Cada matriz tem um tipo de dados, mas difere do tipo de dados de seus elementos. Não há tipo único de dados para todas as matrizes. Em vez disso, o tipo de dados de uma matriz é determinado pelo número de dimensões ou classificação, da matriz e o tipo de dados dos elementos na matriz. Duas variáveis array são consideradas do mesmo tipo de dados somente quando elas têm o mesmo tamanho e seus elementos têm o mesmo tipo de dados. Os comprimentos das dimensões em uma matriz não influenciam no tipo de dados da matriz.
Cada matriz herda da classe Array e você pode declarar uma variável como o tipo Array, mas você não pode criar uma matriz do tipo Array. Além disso, Instrução ReDim (Visual Basic) não pode operar em uma variável declarada como tipo Array. Por esses motivos, e para segurança de tipo, é aconselhável declarar cada matriz como um tipo específico, como Integer no exemplo anterior.
Você pode localizar o tipo de dados de uma matriz ou seus elementos de várias maneiras.
Você pode chamar o método de Object.GetType na variável para receber um objeto de Type para o tipo de variável. O objeto Type contém informações abrangentes em suas propriedades e métodos.
Você pode passar a variável à função TypeName para receber String que contém o nome do tipo de tempo de execução.
Você pode passar a variável à função VarType para receber VariantType valor que representa a classificação de tipo da variável.
O exemplo a seguir chama a função TypeName para determinar o tipo de matriz e o tipo dos elementos da matriz. O tipo matriz é Integer(,), e os elementos da matriz são do tipo 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)))
Coleções como uma alternativa para matrizes
Matrizes são mais úteis para criar e trabalhar com um número fixo de objetos fortemente tipados. Coleções fornecem uma maneira mais flexível de trabalhar com grupos de objetos. Ao contrário dos arrays, o grupo de objetos com o qual você trabalha pode crescer e reduzir dinamicamente conforme as necessidades do aplicativo mudam.
Se você precisar alterar o tamanho de uma matriz, deverá usar Instrução ReDim (Visual Basic). Quando você fizer isso, Visual Basic cria uma nova matriz e libera a matriz anterior para a disposição. Isso utiliza o tempo de execução. Portanto, se o número de itens com os quais você está trabalhando é alterado com frequência ou se você não pode prever o número máximo de itens necessários, é possível obter melhor desempenho usando uma coleção.
Para algumas coleções, você pode atribuir uma chave a qualquer objeto colocado na coleção para que você possa rapidamente recuperar o objeto usando a chave.
Se sua coleção contiver elementos de apenas um tipo de dados, você pode usar uma das classes no namespace System.Collections.Generic. Uma coleção genérica impõe a segurança de tipo para que nenhum outro tipo de dados possa ser adicionado a ela. Quando você recupera um elemento de uma coleção genérica, não precisa determinar seu tipo de dados ou convertê-lo.
Para obter mais informações sobre coleções, consulte Coleções (C# e Visual Basic).
Exemplo
O exemplo a seguir usa a classe genérica List do .NET Framework para criar uma coleção de lista 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
A declaração da coleção de CustomerFile especifica que ela pode conter elementos somente do tipo Customer. Também fornece uma capacidade inicial de 200 elementos. O procedimento AddNewCustomer verifica a validade do novo elemento e o adiciona à coleção. O procedimento PrintCustomers usa um loop For Each para percorrer a coleção e exibir seus elementos.
Tópicos relacionados
Termo |
Definição |
---|---|
Explica a classificação e as dimensões em matrizes. |
|
Descreve como preencher matrizes com valores iniciais. |
|
Mostra como classificar os elementos de uma matriz alfabeticamente. |
|
Descreve as regras e as etapas para a atribuição de uma matriz a outra variável de matriz. |
|
Descreve alguns problemas comuns que surgem ao se trabalhar com matrizes. |