VB.NET - Apresentando Arrays


Um array (matriz) é uma lista de valores onde todos os valores no grupo são referenciados pelo nome da matriz e o índice atribuído ao valor específico na matriz. Um valor individual de um array é chamado elemento. Os arrays são criados na memória do computador e por isto possui um bom desempenho no seu tratamento.

Cada elemento possui um número relacionado que é utilizado como índice da matriz. A referência usa o nome da matriz e o número entre parênteses. Assim:

NomedoVetor(NúmeroDoElemento)   -    Ex: Vetor(1) - refere-se ao elemento que possui o índice 1. 

Em VB.NET todos os arrays são indexados a partir de zero. Logo temos :

Quantidade(0) - refere-se ao primeiro elemento

Quantidade(3) - refere-se ao quarto elemento 

Nota : No VB.NET não existe mais "option base"  que você podia usar para alterar o valor do índice inicial de um array.

Existem mais de uma maneira de declarar um vetor unidimensional em VB.NET.  Abaixo alguns exemplos

Dim Vetor(4) As Integer Define um array com 5 elementos iniciados com zero
Dim Vetor As Integer =  new Integer(4) {} Define um array com 5 elementos iniciados com zero
Dim Vetor() As Integer = {1, 2, 3, 4, 5} Define um array com 5 elementos e atribui valores a cada elemento
Dim Vetor As Integer =  new Integer(4) { 0, 1, 2, 3, 4} Define um array com 5 elementos e atribui valores a cada elemento
Redim Vetor(10) Redimensiona o array Vetor para 11 elementos
ReDim Preserve Vetor(10)  Redimensiona o array Vetor para 11 elementos

Nota: Redim somente pode ser usado a nível de procedure. Não pode ser usado em módulo ou classe.

A utilização de arrays é muito importante e facilita em muito o trabalho de programação. Usando arrays podemos facilmente armazenar e exibir dados em tabelas usando um laço FOR/NEXT.

A matriz abaixo tem o nome de Estados e armazenas 5 nomes de estados brasileiros:

Elemento Nome Para listar os nomes dos estados armazenados no array acima podemos usar o código :
 

For i = 0 to 4                       

    Debug.WriteLine(Estados(i))

Next i                                  

0 São Paulo
1 Rio de Janeiro
2 Belo Horizonte
3 Brasília
4 Porto Alegre

Para criar um array na memória precisamos declarar o array como fazemos com qualquer outra variável. Geralmente usamos a declaração Dim para declarar um array que é tem visibilidade local. Podemos usar os modificadores Private, Public e Friend e alterar o nível de escopo de visibilidade do array.

Quando um array é declarado é alocado um espaço de armazenamento na memória e os elementos são iniciados. Elementos numéricos são iniciados para zero e um array de elementos strings (alfanuméricos) são iniciados para uma string vazia.

Exemplo:

Dim strNomes(25) As String Declara um array do tipo String com 26 elementos
Private Quantidade(10) As Integer Declara um array do tipo Integer com 11 elementos

Você pode também declarar arrays e atribuir valores para os elementos. Assim :

Public Materias() As String = {"Matematica" , "Geografia" , "Física" , "Química" , "Inglês" }

Nesta declaração estou criando um array do tipo String com 5 elementos . Os valores de cada elemento são incluídos entre Colchetes. Embora não tenhamos referenciado o número de cada elemento, temos que Materias(0) refere-se a Matemática , e assim por diante.

Se tentarmos acessar um elemento usando um número que não esta atribuído a nenhum elemento iremos obter um erro. No exemplo acima se tentarmos acessar um suposto elemento com índice 6 : Materias(6) iremos obter a seguinte mensagem de erro :

An unhandled exception of type 'System.IndexOutOfRangeException' occured in ...

Os arrays são processados usando laços (loops) e o laço FOR/NEXT , como já foi dito anteriormente pode ser usado com este intuito. Além do laço FOR/NEXT o VB .NET fornece o laço - For Each/Next. A vantagem do deste laço é que você não precisa manipular o índice.

Embora o loop For Each...Next seja similar o loop For...Next ele executa um bloco de declaração para cada elemento na coleção ao invés de especificar um número de vezes. A sintaxe é :

For Each elemento In coleção
   ' executa o bloco para cada elemento de elemento.
Next [ elemento ]
No exemplo abaixo serão exibidos no console o nome de cada matéria do array.

Module Module1
 

Sub Main()
 

Dim Materias() As String = {"Matematica", "Geografia", "Física", "Química", "Inglês"}
 

Dim nome As String
 

For Each nome In Materias

    Console.WriteLine(nome)

Next
 

Console.ReadLine()


End
Sub

End Module

Para iniciar todos os elementos de um array com um valor podemos fazer como no código abaixo onde atribuímos o valor zero a todos os elementos do array Quantidade.

Module Module1
 

Sub Main()
 

Dim Quatidade(25) As Integer
 

Dim i as integer
 

For Each i In Quantidade

    i = 0

Next i
 

End Sub

End Module

 

Os arrays possuem algumas características avançadas no VB.NET:

A seguir irei relacionar as principais propriedades e métodos da classe array . Sua utilização permite um tratamento avançado e eficaz.

 

Propriedades

 

IsFixedSize Indica se o array tem um tamanho fixo.
IsReadOnly Indica se o array é somente leitura(read-only)
IsSynchronized Indica se o acesso ao array é sincronizado (thread-safe).
Length Obtem o total de elementos em todas as dimensões do array.
Rank Obtem o número de dimensões do array.
SyncRoot Obtem um objeto que pode ser usado para sincronizar o acesso ao array.

Métodos

Clear Define o intervalo dos elementos de um array para zero, para false ou para null.
Clone Cria uma copia do array.
Copy Copia a seção de um array para outro array e realiza o casting e o boxing requerido
CopyTo Copia todos os elementos de array de uma dimensão para outro array.
CreateInstance Inicializa uma nova instância da classe array.
Equals (herdado de Object) Determina se duas instâncias de objetos são iguais.
GetLength Obtém o numero de elementos de uma dimensão especificada de um array.
GetLowerBound Obtémo menor indice inferior da dimensão especificada em um array
GetType (herdado de Object) Obtémo tipo da instância atual
GetUpperBound (Equivale ao UBound do VB6) Obtémo indice superior  da dimensão especificada em um array
GetValue Obtém o valor de um elemento definido no array.
IndexOf Retorna o indice da primeira ocorrência de um valor em um array de uma dimensão.
Initialize Inicia cada elemento de um array chamando o construtor padrão.
Reverse Reverte a ordem dos elementos de um array de uma dimensão.
SetValue Define o elemento especificado em um array para um valor definido.
Sort Ordena os elementos de um array de uma dimensão.
ToString (inherited from Object) Retorna uma string que representa o objeto atual.

 

Podemos comparar um array com a palavra-chave nothing para ter certeza de que o array não esta inicializado. O código é o seguinte:

 

Dim Vetor() as Integer

If Vetor = Nothing then
      Response.Write(“O array não esta inicializado.”)
Else
      Response.Write(“O array esta inicializado”)
End if

 

Vejamos a seguir um exemplo de utilização de arrays para armazenar valores em um programa VB .NET.

 

1-) Inicie um novo projeto no VB.NET do tipo Windows Application e no formulário padrão insira os controles :

conforme figura abaixo:

 

Ao lado temos o formulário onde o usuário vai informar o número da equipe e o valor da venda.

Estamos armazenando os valores no array mdecTotalVendas cuja representação gráfica esta representada na figura.

Ao clicar no botão Exibir os valores serão exibidos no listbox - lstRelacao.

O bloco Try/Catch verifica se um número entre 1 e 5 foi informado para a equipe e se o valor das vendas também foi informado.

 

2-) O código do formulário é o seguinte :

 

Public Class Form1

Inherits System.Windows.Forms.Form
 

Dim mdecTotalVendas(5) As Decimal


Private
Sub cmdOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOK.Click


Dim
intEquipe As
Integer

Dim decVendas As Decimal


Try


      intEquipe =
CInt(txtEquipe.Text)

      decVendas = CDec(txtVendas.Text)


'verifica o numero da equipe (estamos limitados pela definição do array)

If intEquipe >= 1 And intEquipe <= 5 Then


'acumula a quantidade das vendas atribuindo os valores a cada elemento do array

mdecTotalVendas(intEquipe) += decVendas


'limpa os textboxes e define o foco

txtVendas.Text = ""

txtEquipe.Text = ""

txtEquipe.Focus()

Else

MessageBox.Show("Numero atribuido a equipe esta incorreto (Informe de 1 a 5).", _

"Dados informados inválidos", _

MessageBoxButtons.OK, _

MessageBoxIcon.Exclamation)

End If

Catch

MessageBox.Show("Informe o número da equipe e o valor das vendas.", _

"Dados informados inválidos", _

MessageBoxButtons.OK, _

MessageBoxIcon.Exclamation)

End Try
 

End Sub

 

Private Sub cmdExibir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdExibir.Click


Dim
intEquipe As
Integer


lstRelacao.Items.Clear()

 

'exibe os elementos do array no listbox
For
intEquipe = 1 To 5

     lstRelacao.Items.Add("Equipe : " & CStr(intEquipe) & " - " & FormatCurrency(mdecTotalVendas(intEquipe)))

Next
 

End Sub

End Class

 

3-) O resultado após você informar um valor e clicar no botão Exibir pode ser como mostrado abaixo:

 

 

 

Com este exemplo espero ter deixado claro como um array de uma dimensão é declarado e  utilizado. E por falar em uma dimensão vamos falar agora de arrays com mais de uma dimensão.

 

Arrays Multidimensionais

 

Um array com mais de uma dimensão pode ser representado por uma matriz com linhas e colunas. Abaixo temos uma figura que representa uma matriz do tipo 3  por 3 ; três linhas e 3 colunas. A declaração de um array com mais de uma dimensão

 

100 200 300
250 180 140
160 80 135

 

Podemos usar um array com duas dimensões para representar a matriz acima. A declaração do array seria feita da seguinte forma:

 

Dim Vetor(2,2)      para atribuir os valores para o array podemos fazer:

 

Dim values(,) As Integer = {  {100, 200, 300},  {250, 180, 140} , {160, 80, 135}}

 

Da mesma forma podemos fazer :

 

Dim values1(9, 9) As Integer Declara um array com 100 elementos
Dim values2(,) As Integer    Declara um array sem limites
ReDim values2(9, 9)          Define o tamanho do array
Dim values(,) As Integer = { {1, 2, 3}, {4, 5, 6}} Declarando um array com duas dimensões de seis elementos (indice(0,0) até indice(1,2)

A representação de sua matriz seria:

1 2 3
4 5 6
Dim values(,) As Integer = { _
                                    {{1, 2, 3}, _
                                    {4, 5, 6}}, _
                                    {{7, 8, 9}, _
                                    {10, 11, 12}} _
                                    }
 

Declara um array com três dimensões com 12 elementos :  outra forma de ver o vetor seria: 

Dim values(,) As Integer = { {{1, 2, 3}, {4, 5, 6}}, {{7, 8, 9}, {10, 11, 12}}}

A matriz que representaria o array é:

1 2 3
4 5 6
7 8 9
10 11 12

Dim Vetor(,,,)

Declara um array de quatro dimensões

Dim Vetor(3,3,3,3)

Declara um array de quatro dimensões

Abaixo temos a declaração de um array de três dimensões ;em seguida usamos a declaração Redim para declarar o tamanho do array e em seguida atribuímos valores elementos do array usando laços For/Next:

Nota: Redim não pode mudar dinamicamente o número de dimensões de um array.

Dim Vetor( , , ) as Integer 

ReDim Vetor(5,5,5)

Dim x,y,z as integer 

For x = 0 to 4
      For y = 0 to 4
            For z = 0 to 4
                  Vetor(x,y,z) = x + y + z
            Next
      Next
Next
 

 

Vou mostrar agora um exemplo de como podemos usar trabalhar com um array de mais de uma dimensão.

 

Vamos supor que você tenha uma tabela com os dados das vendas de produtos e que você gerou um array com duas dimensões de 2000 por 10.(Temos 2000 produtos e 10 regiões). Vou chamar este array de Produtos e a declaração para criar este vetor poderia ser feita assim:

 

Dim Produtos(2000,10) As Long

 

O array contém o número de produtos vendidos ( uma linha para cada produto) por região (uma coluna por região).

 

Cada elemento do array - Produtos -  irá representar a quantidade vendida do produto para uma região definida.

 

Nosso objetivo será calcular o Total de cada produto vendidos para todas as regiões e o total de produtos vendidos por região.

 

Para armazenar o valor total de produtos vendidos para todas as regiões eu vou criar o array - TotalProdutoRegiao . Cada elemento deste array conterá a soma de cada produto para todas as 10 regiões.A declaração do array é feita assim:

 

Dim lng TotalProdutoRegiao(2000) As Long

 

Para armazenar o total de vendas de todos os produtos  para cada região criarei o array - TotalProdutosPorRegiao . Cada elemento deste array conterá a soma de todos os produtos vendidos para uma região.A declaração do array é feita assim:

 

Dim TotalProdutosPorRegiao(10) As Long

 

A matriz que representará o array pode ser representada como abaixo. Representamos também dois vetores que vamos usar para fazer a totalização de produtos e produtos vendidos por região.

 

Produtos                                                                                                        TotalProdutoRegiao

1,1 1,2 ... ...           1,10       1
2,1                         2
3,1                         ...
... ...                        
2000,1                 2000,10      
2000
                           
1 2 ...             10        

TotalProdutosPorRegiao

 

Vamos agora mostrar o código que implementa estas funcionalidades:

 

        Dim Produtos(2000, 10) As Long
        Dim TotalProdutoRegiao(2000) As Long
        Dim TotalProdutosPorRegiao(10) As Long

        Dim intLinha As Integer
        Dim intColuna As Integer

        For intLinha = 1 To 2000
            For intColuna = 1 To 10
                'soma atraves das linhas
                TotalProdutoRegiao(intLinha) += Produtos(intLinha, intColuna)

                'soma as colunas
                TotalProdutosPorRegiao(intColuna) += Produtos(intLinha, intColuna)
            Next
        Next

 

O código acima leva em conta que o array Produtos tenha sido inicializado com os valores de uma tabela e pode ser usado para calcular os totais alimentando os arrays declarados para este fim.

 

Declarando arrays de arrays (jagged arrays)

 

Neste caso temos que cada elemento do array é outro array que pode conter qualquer número de elementos. A declaração é feita da seguinte forma:

 

Dim Valores(9)() As Integer

 

No caso cima temos 10 entradas , sendo que cada uma é um array de inteiros.

 

Podemos também inicializar um array de array quando o declaramos , embora isto seja um tanto mais complexo que iniciar um array comum. Para isto precisamos criar um array de objetos para cada entrada.

 

Dim Vetor1() As Integer = {1, 2, 3}
Dim Vetor2() As Integer = {4, 5}
Dim Vetores()() As Integer = {Vetor1, Vetor2}

 

Podemos também iniciar os sub-arrays da seguinte forma:

 

Dim Vetores()() As Integer = { _
                                                       New Integer() {1, 2, 3}, _
                                                       New Integer() {4, 5} _

                                                      }
 

que idêntico a :  Dim Vetores()() As Integer = { New Integer() {1, 2, 3}, New Integer() {4, 5} }

 

Um exemplo prático para este tipo de array seria a possibilidade de criar um array dos meses do ano onde cada mês possui um número diferente de dias. O código abaixo faz exatamente esta declaração:

 

Dim Vendas()() As Double = {New Double(11) {}}    
Dim Mes As Integer   
Dim Dias As Integer    

For Mes = 0 To 11 
   Dias = DateTime.DaysInMonth(Year(Now), Mes)      'Pega o número de dias do mes. 
   Vendas(Mes) = New Double(Dias - 1) {}                'Atribui um array para o mes. 
Next Mes

 

Arrays de objetos

 

A classe array não tem o seu próprio construtor de forma que você não pode criar um array de objetos do princípio. Você pode usar o método CreateInstance para criar um array de um tipo específico. Este método possui muitas versões que podemos usar vejamos um exemplo:

 

Dim Nomes As Array = Array.CreateInstance(  GetType(String), 3, 3, 10)

 

A declaração acima cria um array de strings com três dimensões. A primeira dimensão tem 3 elementos , a segunda também 3 e a terceira 10 elementos. Totalizando 90 elementos com indice de (0,0,0) a (2,2,9).

 

Com isto podemos criar um array e preenchê-lo com outros arrays de diferentes tipos.

 

Por ora acabei, voltarei ao assunto array em outro artigo. Até lá...

 

Veja os Destaques e novidades do SUPER DVD Visual Basic  (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C#  com exclusivo material de suporte e vídeo aulas com curso básico sobre C#.

Veja também os Cursos com vídeo aulas e projetos exemplos:

    Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti