Compartilhar via


Matrizes em 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 com o mesmo nome, e usa um número que é chamado um índice ou subscrito a eles dizer distante.Os valores individuais são chamados os elementos da matriz.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 é chamado 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 aninhados
  • Percorrer uma matriz

  • Matrizes como valores de retorno e parâmetros

  • Matrizes denteadas

  • Matrizes de comprimento zero

  • Tamanho da matriz

  • Os tipos e outro tipo de matriz

  • 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 de elementos variam de 0 a 6.Ter essa matriz é mais simples de sete declarando variáveis.

A ilustração a seguir mostra a matriz students.Para cada elemento da matriz:

  • O índice de um elemento representa o grau (o índice 0 representa o ambiente de infância).

  • O valor que está contido no elemento representa o número de alunos nessa ordem.

Elementos da matriz de “alunos”

Imagem de matriz mostrando números de alunos

O exemplo a seguir mostra como fazer referência ao primeiro, o segundo, e o ú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-se a matriz em datasets usando apenas o nome da variável de matriz sem índices.

A matriz students no exemplo anterior usa um índice e seriam unidimensional.Uma matriz que usa mais de um índice ou subscrito é chamada multidimensional.Para obter mais informações, consulte o restante deste tópico e Dimensões de matriz em 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 criou, 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, você pode redefinir seu tamanho usando a instrução de Redim .Você pode especificar que a declaração de Redim deve manter os valores que estão na matriz, ou você pode especificar que cria uma matriz vazia.O exemplo a seguir mostra diferentes usa a declaração de Redim alterar 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 ReDim instrução (Visual Basic).

Declarando uma matriz

Você declara uma variável de matriz a 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 escalar, que é uma variável que contém um único valor.

Depois que você declare a matriz, você pode definir o tamanho usando ReDim instrução (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 de matriz usando ReDim instrução (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 de matriz usando ReDim instrução (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 array mas eles não aloca matrizes.Você ainda deve criar uma matriz, inicialize, e a atribui 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 várias dimensões matrizes 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

Usando 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 as duas opções.

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

Quando você usa inferência de tipos, o tipo do array é determinado por dominante na lista de valores que é fornecida para o literal de matriz.O tipo é dominante exclusivo a um tipo que qualquer outro tipo no literal de matriz pode se expandir.Se este tipo exclusivo não pode ser determinado, o tipo é dominante o tipo exclusivo a que qualquer outro tipo na matriz pode aperfeiçoar.Se nenhum desses tipos podem ser exclusivos determinados, o tipo é dominante Object.Por exemplo, se a lista de valores que é fornecida para o literal de matriz contém valores do tipo Integer, Long, e Double, a matriz resultante é do tipo Double.Integer e Long alargam-se somente a Double.Como consequência, Double é dominante o tipo.Para obter mais informações, consulte Ampliação e restrição de conversões (Visual Basic).Essas regras se aplicam a inferência de tipos que são inferidos para matrizes que são variáveis locais que são definidos em um membro da classe.Embora você possa usar literais de matriz quando você cria variáveis no 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 os valores que são fornecidos para o literal de matriz como o tipo Object.

Você pode especificar explicitamente o tipo dos elementos em uma matriz que é criado usando um literal de matriz.Nesse caso, os valores no literal de matriz deve ampliar para o tipo dos elementos da matriz.O exemplo de código a seguir cria uma matriz do tipo Double de uma lista de inteiros.

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

wak0wfyt.collapse_all(pt-br,VS.110).gifLiterais de matriz aninhados

Você pode criar uma matriz multidimensional usando literais de matriz aninhados.Literais de matriz aninhados devem ter uma dimensão e um número de dimensões, ou de classificação, que é 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 ocorreria se o número de elementos em literais de matriz aninhados não corresponde.Um erro também ocorreria se você declarar explicitamente a variável de matriz para ser diferente bidimensional.

ObservaçãoObservação

Você pode evitar um erro quando você fornece literais de matriz aninhados de diferentes dimensões incluindo os literais de matriz internos entre parênteses.Os parênteses forçam a expressão do literal de matriz a ser avaliada, e os valores resultantes são usados com o literal de matriz externo, porque o código a seguir mostra.

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.Quando você usa 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ê itera através uma matriz, você acessar cada elemento na matriz índice do menor para o maior índice.

O exemplo efetua iterações através uma matriz unidimensional usando Para...Próxima instrução (Visual Basic).O método de GetUpperBound retorna o valor maior 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 efetua iterações através uma matriz multidimensional usando uma instrução de For...Next .O método de GetUpperBound tem um parâmetro que especifica a dimensão.GetUpperBound(0) retorna o valor de índice alto para a primeira dimensão, e retornos de GetUpperBound(1) o valor de índice alto para a primeira 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 efetua iterações através uma matriz unidimensional usando Para cada...Próxima instrução (Visual Basic).

Dim numbers = {10, 20, 30}

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

O exemplo efetua iterações através uma matriz multidimensional usando uma instrução de For Each...Next .No entanto, você tem mais controle sobre os elementos de uma matriz multidimensional se você usar uma instrução aninhada de For…Next , como no exemplo anterior, em vez de uma instrução 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

Matrizes como valores de retorno e parâmetros

Para retornar uma matriz de um procedimento de Function , especifique o tipo de dados de matriz e o número de dimensões como o tipo de retorno de Instrução de função (Visual Basic).Dentro da função, declare uma variável array local com o mesmo tipo de dados e número de dimensões.Em Instrução Return (Visual Basic), inclua a variável array local sem parênteses.

Para especificar uma matriz como um parâmetro para um procedimento de Sub ou de Function , defina o parâmetro como uma matriz com um tipo de dados e um número de dimensões especificadas.Na chamada ao procedimento, enviar uma variável de matriz com o mesmo tipo de dados e número de dimensões.

No exemplo, a função de GetNumbers retorna 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 função de GetNumbersMultiDim retorna 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 os elementos são conhecidos 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 tem uma matriz de meses, que 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.Como consequência, 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 é chamado um array 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 tem 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 um array de comprimento zero nas seguintes circunstâncias:

  • Sem arriscar uma exceção de NullReferenceException , seu código deve acessar membros de classe de Array , como Length ou Rank, ou chamar uma função de Visual Basic como UBound.

  • Você deseja manter o código mais simples por não ter que procurar por Nothing como um caso especial.

  • Seu código interage com um interface de programação de aplicativos (API) que o requer passar uma matriz de comprimento zero para um ou mais procedimentos ou o 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 contidos na matriz.

O seguinte exemplo declara uma matriz tridimensional.

Dim prices(3, 4, 5) As Long

O tamanho total da matriz em prices variável é (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 da matriz de dimensional usando o método de GetLength .

Você pode redimensionar uma variável de matriz atribuindo um novo objeto de matriz a ele ou usando a instrução de ReDim .

Há várias coisas para ter em mente ao manipular o tamanho de uma matriz.

Comprimento de dimensão

O índice de cada dimensão é baseado em 0, o que significa que ele varia de 0 por meio do limite superior.Como consequência, o comprimento de uma determinada dimensão é maior por 1 do limite superior declarado para a dimensão.

Limites de comprimento

O comprimento de cada dimensão da matriz é limitado para o valor máximo do tipo de dados de Integer , que é (2 ^ 31) - 1.No entanto, o tamanho total da matriz é também delimitado pela memória disponível no seu sistema.Se você tentar inicializar uma matriz que excede a quantidade de RAM disponível, o common language runtime gera uma exceção de 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, não o número de bytes que consomem no armazenamento.

Consumo de memória

Não é seguro fazer suposições nenhuma em relação a como uma matriz é armazenado na memória.O armazenamento varia em plataformas de larguras diferentes de dados, para que a mesma matriz pode consumir mais memória em um sistema de 64 bits do que em um sistema de 32 bits.Dependendo da configuração de sistema quando você inicializa uma matriz, o tempo de execução (CLR) do runtime pode atribuir o armazenamento para elementos do bloco tão próxima juntos possível, ou alinhá-los em todos os limites naturais de hardware.Além disso, uma matriz requer uma sobrecarga do armazenamento para suas informações de controle, e gera dessa sobrecarga com cada dimensão adicionada.

Os tipos e outro tipo de matriz

Cada matriz tem um tipo de dados, mas difere do tipo de dados de seus elementos.Não há unico tipo de dados para todos os arrays.Em vez disso, o tipo de dados de um array é determinado pelo número de dimensões, ou de classificaçãode matriz, e o tipo de dados dos elementos na matriz.Duas variáveis de matriz são consideradas do mesmo tipo de dados somente quando têm a mesma ordem e seus elementos têm o mesmo tipo de dados.Os tamanhos das dimensões em uma matriz não influenciam o tipo de dados de matriz.

Cada matriz herda da classe de System.Array , e você pode declarar uma variável para ser do tipo Array, mas você não pode criar uma matriz do tipo Array.Além disso, ReDim instrução (Visual Basic) não pode operar em uma variável declarada com o tipo Array.Por esses motivos, e para segurança de tipos, é 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 tempo de execução da variável.O objeto de Type contém informações abrangentes em suas propriedades e métodos.

  • Você pode passar a variável à função de TypeName para receber String que contém o nome do tipo de tempo de execução.

  • Você pode passar a variável à função de VarType para receber um valor de VariantType que representa a classificação de tipo de variável.

O exemplo a seguir chama a função de TypeName para determinar o tipo de matriz e o tipo dos elementos da matriz.O tipo matriz é Integer(,) e os elementos na 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

Arrays 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 das matrizes, o grupo de objetos que você trabalha pode crescer e reduzir dinamicamente conforme as necessidades do aplicativo mudam.

Se você precisar alterar o tamanho de uma matriz, você deve usar ReDim instrução (Visual Basic).Quando você fizer isso, Visual Basic cria uma nova matriz e libera a matriz anterior para a disposição.Isso leva tempo de execução.Como consequência, se o número de itens que você está trabalhando com alterações geralmente, ou você não pode prever o número máximo de itens necessários, você pode obter melhor desempenho usando uma coleção.

Para algumas coleções, você pode atribuí-lo a uma chave a qualquer objeto que coloca na coleção para que você possa rapidamente recuperar o objeto usando a chave.

Se a coleção contém os elementos de apenas um tipo de dados, você pode usar uma das classes no namespace de System.Collections.Generic .Uma coleção Genérica impõe 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, você não precisa determinar seu tipo de dados ou convertê-lo.

Para obter mais informações sobre as coleções, consulte Coleções (C# e Visual Basic).

wak0wfyt.collapse_all(pt-br,VS.110).gifExemplo

O exemplo seguinte usa a classe genérica System.Collections.Generic.List<T> de .NET Framework para criar uma coleção lista de objetos de 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 pode conter somente os elementos de tipo Customer.Também fornece a capacidade inicial de 200 elementos.O procedimento AddNewCustomer verifica o novo elemento para validade e adicioná-la à coleção.O procedimento PrintCustomers usa um loop de For Each para atravessar a coleção e exibir seus elementos.

Tópicos relacionados

Termo

Definição

Dimensões de matriz em Visual Basic

Explica a posição e dimensões em matrizes.

Como inicializar uma variável de matriz no Visual Basic

Descreve como preencher matrizes com valores iniciais.

Como: classificar uma matriz em Visual Basic

Mostra como classificar os elementos de uma matriz alfabeticamente.

Como: atribuir um Array para outro Array (Visual Basic)

Descreve as regras e as etapas para atribuir uma matriz a outra variável de matriz.

Solucionando problemas de matrizes (Visual Basic)

Descreve alguns problemas comuns que surgem ao trabalhar com matrizes.

Consulte também

Referência

Instrução (Visual Basic) Dim

ReDim instrução (Visual Basic)

Array