Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Uma matriz é um conjunto de valores, que são denominados elementos, que estão logicamente relacionados entre si. Por exemplo, uma matriz pode consistir no número de alunos em cada série de uma escola secundária; Cada elemento da matriz é o número de alunos em uma única série. Da mesma forma, uma matriz pode consistir nas notas de um aluno para uma classe; Cada elemento da matriz é um único grau.
É possível usar variáveis individuais para armazenar cada um dos nossos itens de dados. Por exemplo, se o nosso aplicativo analisa as notas dos alunos, podemos usar uma variável separada para a nota de cada aluno, como englishGrade1, englishGrade2, etc. Esta abordagem tem três limitações principais:
- Temos de saber, no momento do projeto, exatamente quantos níveis temos de gerir.
- Lidar rapidamente com um grande número de notas torna-se complicado. Isso, por sua vez, torna um aplicativo muito mais propenso a ter bugs graves.
- É difícil de manter. Cada nova classificação que adicionamos requer que o aplicativo seja modificado, recompilado e reimplantado.
Usando uma matriz, você pode fazer referência a esses valores relacionados pelo mesmo nome e usar um número chamado índice ou subscrito para identificar um elemento individual com base em sua posição na matriz. Os índices de uma matriz variam de 0 a um a menos do que o número total de elementos na matriz. Quando você usa a sintaxe do Visual Basic para definir o tamanho de uma matriz, você especifica seu índice mais alto, não o número total de elementos na matriz. Você pode trabalhar com a matriz como uma unidade, e a capacidade de iterar seus elementos livra você da necessidade de saber exatamente quantos elementos ela contém no momento do design.
Alguns exemplos rápidos antes da explicação:
' Declare a single-dimension array of 5 numbers.
Dim numbers(4) As Integer
' Declare a single-dimension array and set its 4 values.
Dim numbers = New Integer() {1, 2, 4, 8}
' Change the size of an existing array to 16 elements and retain the current values.
ReDim Preserve numbers(15)
' Redefine the size of an existing array and reset the values.
ReDim numbers(15)
' Declare a 6 x 6 multidimensional array.
Dim matrix(5, 5) As Double
' Declare a 4 x 3 multidimensional array and set array element values.
Dim matrix = New Integer(,) {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}}
' Declare a jagged array
Dim sales()() As Double = New Double(11)() {}
Elementos de matriz em uma matriz simples
Vamos criar uma matriz nomeada students para armazenar o número de alunos em cada série em uma escola secundária. Os índices dos elementos variam de 0 a 6. Usar essa matriz é mais simples do que declarar sete variáveis.
A ilustração a seguir mostra a students matriz. Para cada elemento da matriz:
O índice do elemento representa a nota (o índice 0 representa o jardim de infância).
O valor contido no elemento representa o número de alunos nessa série.
O exemplo a seguir contém o código do Visual Basic que cria e usa a matriz:
Module SimpleArray
Public Sub Main()
' Declare an array with 7 elements.
Dim students(6) As Integer
' Assign values to each element.
students(0) = 23
students(1) = 19
students(2) = 21
students(3) = 17
students(4) = 19
students(5) = 20
students(6) = 22
' Display the value of each element.
For ctr As Integer = 0 To 6
Dim grade As String = If(ctr = 0, "kindergarten", $"grade {ctr}")
Console.WriteLine($"Students in {grade}: {students(ctr)}")
Next
End Sub
End Module
' The example displays the following output:
' Students in kindergarten: 23
' Students in grade 1: 19
' Students in grade 2: 21
' Students in grade 3: 17
' Students in grade 4: 19
' Students in grade 5: 20
' Students in grade 6: 22
O exemplo faz três coisas:
- Ele declara uma
studentsmatriz com sete elementos. O número6na declaração de matriz indica o último índice na matriz, é um a menos do que o número de elementos na matriz. - Ele atribui valores a cada elemento na matriz. Os elementos da matriz são acessados usando o nome da matriz e incluindo o índice do elemento individual entre parênteses.
- Ele lista cada valor da matriz. O exemplo usa uma
Forinstrução para acessar cada elemento da matriz por seu número de índice.
A students matriz no exemplo anterior é uma matriz unidimensional porque usa um índice. Uma matriz que usa mais de um índice ou subscrito é chamada multidimensional. Para obter mais informações, consulte o restante deste artigo e Dimensões de matriz no Visual Basic.
Criando uma matriz
Você pode definir o tamanho de uma matriz de várias maneiras:
Você pode especificar o tamanho quando a matriz é declarada:
' Declare an array with 10 elements. Dim cargoWeights(9) As Double ' Declare a 24 x 2 array. Dim hourlyTemperatures(23, 1) As Integer ' Declare a jagged array with 31 elements. Dim januaryInquiries(30)() As StringVocê pode usar uma
Newcláusula para fornecer o tamanho de uma matriz quando ela é criada:' Declare an array with 10 elements. Dim cargoWeights() As Double = New Double(9) {} ' Declare a 24 x 2 array. Dim hourlyTemperatures(,) As Integer = New Integer(23, 1) {} ' Declare a jagged array with 31 elements. Dim januaryInquiries()() As String = New String(30)() {}
Se você tiver uma matriz existente, poderá redefinir seu tamanho usando a ReDim instrução. Você pode especificar que a ReDim instrução mantém os valores que estão na matriz ou pode especificar que ela cria uma matriz vazia. O exemplo a seguir mostra diferentes usos da ReDim instrução para modificar o tamanho de uma matriz existente.
' Assign a new array size and retain the current values.
ReDim Preserve cargoWeights(20)
' Assign a new array size and retain only the first five 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 a Declaração ReDim.
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 fazendo referência a cada local da matriz usando seu índice entre parênteses. Os índices para matrizes multidimensionais são separados por vírgulas (,). Você precisa de um índice para cada dimensão da matriz.
O exemplo a seguir mostra algumas instruções que armazenam e recuperam valores em matrizes.
Module Example
Public Sub Main()
' Create a 10-element integer array.
Dim numbers(9) As Integer
Dim value As Integer = 2
' Write values to it.
For ctr As Integer = 0 To 9
numbers(ctr) = value
value *= 2
Next
' Read and sum the array values.
Dim sum As Integer
For ctr As Integer = 0 To 9
sum += numbers(ctr)
Next
Console.WriteLine($"The sum of the values is {sum:N0}")
End Sub
End Module
' The example displays the following output:
' The sum of the values is 2,046
Preenchendo uma matriz com literais de matriz
Usando um literal de matriz, você pode preencher uma matriz com um conjunto inicial de valores ao mesmo tempo em que a cria. Um literal de matriz consiste em uma lista de valores separados por vírgulas que estão entre chaves ({}).
Ao criar uma matriz usando um literal de matriz, você pode fornecer o tipo de matriz ou usar a inferência de tipo para determinar o tipo de matriz. O exemplo a seguir mostra ambas as opções.
' Array literals with explicit type definition.
Dim numbers = New Integer() {1, 2, 4, 8}
' Array literals with type inference.
Dim doubles = {1.5, 2, 9.9, 18}
' Array literals with explicit type definition.
Dim articles() As String = { "the", "a", "an" }
' Array literals with explicit widening type definition.
Dim values() As Double = { 1, 2, 3, 4, 5 }
Quando você usa a inferência de tipo, o tipo da matriz é determinado pelo tipo dominante na lista de valores literais. O tipo dominante é aquele para o qual todos os outros tipos na matriz podem expandir. Se esse tipo exclusivo não puder ser determinado, o tipo dominante será o tipo exclusivo ao qual todos os outros tipos na matriz podem se estreitar. Se nenhum desses tipos únicos puder ser determinado, o tipo dominante é Object. Por exemplo, se a lista de valores fornecida ao literal da matriz contiver valores do tipo Integer, Longe Double, a matriz resultante for do tipo Double. Porque Integer e Long se alargam apenas até Double, Double é o tipo dominante. Para obter mais informações, consulte Ampliando e restringindo conversões.
Observação
Você pode usar a inferência de tipo somente para matrizes que são definidas como variáveis locais em um membro de tipo. Se uma definição de tipo explícita estiver ausente, matrizes definidas com literais de matriz no nível de classe são do tipo Object[]. Para obter mais informações, consulte Inferência de tipo local.
Observe que o exemplo anterior define values como uma matriz de tipo Double , mesmo que todos os literais de matriz sejam do tipo Integer. Você pode criar essa matriz porque os valores na expressão literal de matriz podem ser expandidos para valores Double.
Você também pode criar e preencher uma matriz multidimensional usando literais de matriz aninhada. Os literais de matriz aninhada devem ter um número de dimensões consistente com a matriz resultante. O exemplo a seguir cria uma matriz bidimensional de inteiros usando literais de matriz aninhada.
' Create and populate a 2 x 2 array.
Dim grid1 = {{1, 2}, {3, 4}}
' Create and populate a 2 x 2 array with 3 elements.
Dim grid2(,) = {{1, 2}, {3, 4}, {5, 6}}
Ao usar literais de matriz aninhada para criar e preencher uma matriz, ocorrerá um erro se o número de elementos nos literais de matriz aninhada não corresponder. Um erro também ocorre se você declarar explicitamente que a variável de matriz tem um número diferente de dimensões do que os literais de matriz.
Assim como para matrizes unidimensionais, você pode recorrer à inferência de tipo ao criar uma matriz multidimensional ao utilizar literais de matrizes aninhadas. O tipo inferido é o tipo dominante para todos os valores em todos os literais de matriz para todos os níveis de aninhamento. O exemplo a seguir cria uma matriz bidimensional de tipo Double[,] a partir de valores que são do tipo Integer e Double.
Dim arr = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}
Para obter exemplos adicionais, consulte Como: Inicializar uma variável de matriz no Visual Basic.
Iteração através de uma matriz
Ao iterar através de uma matriz, você acessa cada elemento da matriz do índice mais baixo para o mais alto ou do mais alto para o mais baixo. Normalmente, use a Instrução Para... Próxima ou a Instrução Para Cada... Próxima para iterar através dos elementos de um array. Quando você não sabe os limites superiores da matriz, você pode chamar o Array.GetUpperBound método para obter o valor mais alto do índice. Embora o menor valor de índice seja quase sempre 0, você pode chamar o Array.GetLowerBound método para obter o menor valor do índice.
O exemplo a seguir itera através de uma matriz unidimensional usando a For...Next instrução.
Module IterateArray
Public Sub Main()
Dim numbers = {10, 20, 30}
For index = 0 To numbers.GetUpperBound(0)
Console.WriteLine(numbers(index))
Next
End Sub
End Module
' The example displays the following output:
' 10
' 20
' 30
O exemplo seguinte itera por meio de uma matriz multidimensional usando uma instrução For...Next. O GetUpperBound método tem um parâmetro que especifica a dimensão.
GetUpperBound(0) Devolve o índice mais elevado da primeira dimensão e GetUpperBound(1) devolve o índice mais elevado da segunda dimensão.
Module IterateArray
Public Sub Main()
Dim numbers = {{1, 2}, {3, 4}, {5, 6}}
For index0 = 0 To numbers.GetUpperBound(0)
For index1 = 0 To numbers.GetUpperBound(1)
Console.Write($"{numbers(index0, index1)} ")
Next
Console.WriteLine()
Next
End Sub
End Module
' The example displays the following output:
' Output
' 1 2
' 3 4
' 5 6
O exemplo a seguir usa uma For Each... Next para iterar por uma matriz unidimensional e uma matriz bidimensional.
Module IterateWithForEach
Public Sub Main()
' Declare and iterate through a one-dimensional array.
Dim numbers1 = {10, 20, 30}
For Each number In numbers1
Console.WriteLine(number)
Next
Console.WriteLine()
Dim numbers = {{1, 2}, {3, 4}, {5, 6}}
For Each number In numbers
Console.WriteLine(number)
Next
End Sub
End Module
' The example displays the following output:
' 10
' 20
' 30
'
' 1
' 2
' 3
' 4
' 5
' 6
Tamanho da matriz
O tamanho de uma matriz é o produto dos comprimentos de todas as suas dimensões. Ele representa o número total de elementos atualmente contidos na matriz. Por exemplo, o exemplo a seguir declara uma matriz de 2 dimensões com quatro elementos em cada dimensão. Como mostra a saída do exemplo, o tamanho da matriz é 16 (ou (3 + 1) * (3 + 1).
Module Example
Public Sub Main()
Dim arr(3, 3) As Integer
Console.WriteLine(arr.Length)
End Sub
End Module
' The example displays the following output:
' 16
Observação
Esta discussão sobre o tamanho da matriz não se aplica a matrizes irregulares. Para obter informações sobre matrizes irregulares e determinar o tamanho de uma matriz irregular, consulte a seção Matrizes irregulares .
Você pode encontrar o tamanho de uma matriz usando a Array.Length propriedade. Você pode encontrar o comprimento de cada dimensão de uma matriz multidimensional usando o Array.GetLength método.
Você pode redimensionar uma variável de matriz atribuindo um novo objeto de matriz a ela ou usando a ReDim instrução. O exemplo a seguir usa a ReDim instrução para alterar uma matriz de 100 elementos para uma matriz de 51 elementos.
Module Example
Public Sub Main()
Dim arr(99) As Integer
Console.WriteLine(arr.Length)
Redim arr(50)
Console.WriteLine(arr.Length)
End Sub
End Module
' The example displays the following output:
' 100
' 51
Há várias coisas a ter em mente ao lidar com o tamanho de uma matriz.
| Observações | |
|---|---|
| Comprimento da dimensão | O índice de cada dimensão é baseado em 0, o que significa que varia de 0 ao seu limite superior. Portanto, o comprimento de uma dada dimensão é maior do que o limite superior declarado dessa dimensão. |
| Limites de comprimento | O comprimento de cada dimensão de uma matriz é limitado ao valor máximo do tipo de Integer dados, que é Int32.MaxValue ou (2 ^ 31) - 1. No entanto, o tamanho total de uma matriz também é limitado pela memória disponível no seu sistema. Caso tente inicializar uma matriz que exceda a quantidade de memória disponível, o tempo de execução lançará um 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 eles consomem na memória. |
| Consumo de memória | Não é seguro fazer suposições sobre como uma matriz é armazenada na memória. O armazenamento varia em plataformas de diferentes larguras de dados, de modo que o mesmo array pode 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 alinhá-los todos em limites naturais de hardware. Além disso, um array requer uma sobrecarga de armazenamento para suas informações de controle, e essa sobrecarga aumenta a cada dimensão adicionada. |
O tipo de matriz
Cada matriz tem um tipo de dados, que difere do tipo de dados de seus elementos. Não há um único tipo 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 de matriz são do mesmo tipo de dados somente quando têm a mesma classificação e seus elementos têm o mesmo tipo de dados. Os comprimentos das dimensões de uma matriz não influenciam o tipo de dados da matriz.
Cada matriz herda da System.Array classe, e você pode declarar uma variável como sendo do tipo Array, mas não pode criar uma matriz do tipo Array. Por exemplo, embora o código a seguir declare que a arr variável é do tipo Array e chame o Array.CreateInstance método para instanciar a matriz, o tipo da matriz prova ser Object[].
Module Example
Public Sub Main()
Dim arr As Array = Array.CreateInstance(GetType(Object), 19)
Console.WriteLine(arr.Length)
Console.WriteLine(arr.GetType().Name)
End Sub
End Module
' The example displays the following output:
' 19
' Object[]
Além disso, a instrução ReDim não pode operar numa variável declarada como tipo Array. Por estas razões, e para segurança de tipo, é aconselhável declarar cada matriz como um tipo específico.
Você pode descobrir o tipo de dados de uma matriz ou seus elementos de várias maneiras.
- Você pode chamar o GetType método na variável para obter um Type objeto que representa o tipo de tempo de execução da variável. O Type objeto contém informações extensas em suas propriedades e métodos.
- Você pode passar a variável para a TypeName função para obter um
Stringcom o nome do tipo de tempo de execução.
O exemplo a seguir chama o GetType método e a TypeName função para determinar o tipo de uma matriz. O tipo de matriz é Byte(,). Observe que a Type.BaseType propriedade também indica que o tipo base da matriz de bytes é a Array classe.
Module Example
Public Sub Main()
Dim bytes(9,9) As Byte
Console.WriteLine($"Type of {nameof(bytes)} array: {bytes.GetType().Name}")
Console.WriteLine($"Base class of {nameof(bytes)}: {bytes.GetType().BaseType.Name}")
Console.WriteLine()
Console.WriteLine($"Type of {nameof(bytes)} array: {TypeName(bytes)}")
End Sub
End Module
' The example displays the following output:
' Type of bytes array: Byte[,]
' Base class of bytes: Array
'
' Type of bytes array: Byte(,)
Matrizes como valores de retorno e parâmetros
Para retornar uma matriz de um Function procedimento, especifique o tipo de dados da matriz e o número de dimensões como o tipo de retorno da instrução de função. Dentro da função, declare uma variável de matriz local com o mesmo tipo de dados e número de dimensões. Na instrução de retorno, inclua a variável de array local sem parênteses.
Para especificar uma matriz como um parâmetro para um Sub ou Function procedimento, defina o parâmetro como uma matriz com um tipo de dados especificado e número de dimensões. Na chamada para o procedimento, passe uma variável de matriz com o mesmo tipo de dados e número de dimensões.
No exemplo a seguir, a GetNumbers função retorna um Integer(), uma matriz unidimensional do tipo Integer. O ShowNumbers procedimento aceita um Integer() argumento.
Module ReturnValuesAndParams
Public Sub Main()
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)
Console.WriteLine($"{numbers(index)} ")
Next
End Sub
End Module
' The example displays the following output:
' 10
' 20
' 30
No exemplo a seguir, a GetNumbersMultiDim função retorna um Integer(,), uma matriz bidimensional do tipo Integer. O ShowNumbersMultiDim procedimento aceita um Integer(,) argumento.
Module Example
Public Sub Main()
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)
Console.Write($"{numbers(index0, index1)} ")
Next
Console.WriteLine()
Next
End Sub
End Module
' The example displays the following output:
' 1 2
' 3 4
' 5 6
Matrizes irregulares
Às vezes, a estrutura de dados em seu aplicativo é bidimensional, mas não retangular. Por exemplo, você pode usar uma matriz para armazenar dados sobre a alta temperatura de cada dia do mês. A primeira dimensão da matriz representa o mês, mas a segunda dimensão representa o número de dias, e o número de dias em um mês não é uniforme. Uma matriz irregular, que também é chamada de matriz de matrizes, é projetada para esses cenários. Uma matriz irregular é uma matriz cujos elementos também são matrizes. Uma matriz irregular e cada elemento em uma matriz irregular podem ter uma ou mais dimensões.
O exemplo a seguir usa uma matriz de meses, cada elemento do qual é uma matriz de dias. O exemplo usa uma matriz irregular porque meses diferentes têm números diferentes de dias. O exemplo mostra como criar uma matriz irregular, atribuir valores a ela e recuperar e exibir seus valores.
Imports System.Globalization
Module JaggedArray
Public Sub Main()
' Declare the jagged array of 12 elements. Each element is an array of Double.
Dim sales(11)() As Double
' Set each element of the sales array to a Double array of the appropriate size.
For month As Integer = 0 To 11
' The number of days in the month determines the appropriate size.
Dim daysInMonth As Integer =
DateTime.DaysInMonth(Year(Now), month + 1)
sales(month) = New Double(daysInMonth - 1) {}
Next
' Store values in each element.
For month As Integer = 0 To 11
For dayOfMonth = 0 To sales(month).GetUpperBound(0)
sales(month)(dayOfMonth) = (month * 100) + dayOfMonth
Next
Next
' Retrieve and display the array values.
Dim monthNames = DateTimeFormatInfo.CurrentInfo.AbbreviatedMonthNames
' Display the month names.
Console.Write(" ")
For ctr = 0 To sales.GetUpperBound(0)
Console.Write($" {monthNames(ctr)} ")
Next
Console.WriteLine()
' Display data for each day in each month.
For dayInMonth = 0 To 30
Console.Write($"{dayInMonth + 1,2}. ")
For monthNumber = 0 To sales.GetUpperBound(0)
If dayInMonth > sales(monthNumber).GetUpperBound(0) Then
Console.Write(" ")
Else
Console.Write($"{sales(monthNumber)(dayInMonth),-5} ")
End If
Next
Console.WriteLine()
Next
End Sub
End Module
' The example displays the following output:
' Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
' 1. 0 100 200 300 400 500 600 700 800 900 1000 1100
' 2. 1 101 201 301 401 501 601 701 801 901 1001 1101
' 3. 2 102 202 302 402 502 602 702 802 902 1002 1102
' 4. 3 103 203 303 403 503 603 703 803 903 1003 1103
' 5. 4 104 204 304 404 504 604 704 804 904 1004 1104
' 6. 5 105 205 305 405 505 605 705 805 905 1005 1105
' 7. 6 106 206 306 406 506 606 706 806 906 1006 1106
' 8. 7 107 207 307 407 507 607 707 807 907 1007 1107
' 9. 8 108 208 308 408 508 608 708 808 908 1008 1108
' 10. 9 109 209 309 409 509 609 709 809 909 1009 1109
' 11. 10 110 210 310 410 510 610 710 810 910 1010 1110
' 12. 11 111 211 311 411 511 611 711 811 911 1011 1111
' 13. 12 112 212 312 412 512 612 712 812 912 1012 1112
' 14. 13 113 213 313 413 513 613 713 813 913 1013 1113
' 15. 14 114 214 314 414 514 614 714 814 914 1014 1114
' 16. 15 115 215 315 415 515 615 715 815 915 1015 1115
' 17. 16 116 216 316 416 516 616 716 816 916 1016 1116
' 18. 17 117 217 317 417 517 617 717 817 917 1017 1117
' 19. 18 118 218 318 418 518 618 718 818 918 1018 1118
' 20. 19 119 219 319 419 519 619 719 819 919 1019 1119
' 21. 20 120 220 320 420 520 620 720 820 920 1020 1120
' 22. 21 121 221 321 421 521 621 721 821 921 1021 1121
' 23. 22 122 222 322 422 522 622 722 822 922 1022 1122
' 24. 23 123 223 323 423 523 623 723 823 923 1023 1123
' 25. 24 124 224 324 424 524 624 724 824 924 1024 1124
' 26. 25 125 225 325 425 525 625 725 825 925 1025 1125
' 27. 26 126 226 326 426 526 626 726 826 926 1026 1126
' 28. 27 127 227 327 427 527 627 727 827 927 1027 1127
' 29. 28 228 328 428 528 628 728 828 928 1028 1128
' 30. 29 229 329 429 529 629 729 829 929 1029 1129
' 31. 30 230 430 630 730 930 1130
O exemplo anterior atribui valores à matriz irregular em uma base elemento a elemento usando um For...Next loop. Você também pode atribuir valores aos elementos de uma matriz irregular usando literais de matriz aninhada. No entanto, a tentativa de usar literais de matriz aninhada (por exemplo, Dim valuesjagged = {{1, 2}, {2, 3, 4}}) gera erro do compilador BC30568. Para corrigir o erro, coloque os literais da matriz interna entre parênteses. Os parênteses forçam a expressão literal da matriz a ser avaliada, e os valores resultantes são usados com a matriz externa literal, como mostra o exemplo a seguir.
Module Example
Public Sub Main()
Dim values1d = { 1, 2, 3 }
Dim values2d = {{1, 2}, {2, 3}, {3, 4}}
Dim valuesjagged = {({1, 2}), ({2, 3, 4})}
End Sub
End Module
Uma matriz irregular é uma matriz unidimensional cujos elementos contêm matrizes. Portanto, a Array.Length propriedade e o Array.GetLength(0) método retornam o número de elementos na matriz unidimensional e Array.GetLength(1) lança um IndexOutOfRangeException porque uma matriz irregular não é multidimensional. Você determina o número de elementos em cada submatriz recuperando o valor da propriedade Array.Length de cada submatriz. O exemplo a seguir ilustra como determinar o número de elementos em uma matriz irregular.
Module Example
Public Sub Main()
Dim jagged = { ({1, 2}), ({2, 3, 4}), ({5, 6}), ({7, 8, 9, 10}) }
Console.WriteLine($"The value of jagged.Length: {jagged.Length}.")
Dim total = jagged.Length
For ctr As Integer = 0 To jagged.GetUpperBound(0)
Console.WriteLine($"Element {ctr + 1} has {jagged(ctr).Length} elements.")
total += jagged(ctr).Length
Next
Console.WriteLine($"The total number of elements in the jagged array: {total}")
End Sub
End Module
' The example displays the following output:
' The value of jagged.Length: 4.
' Element 1 has 2 elements.
' Element 2 has 3 elements.
' Element 3 has 2 elements.
' Element 4 has 4 elements.
' The total number of elements in the jagged array: 15
Matrizes de comprimento zero
Visual Basic diferencia entre uma matriz não inicializada (uma matriz cujo valor é Nothing) e uma matriz de comprimento zero ou matriz vazia (uma matriz que não tem elementos.) Uma matriz não inicializada é aquela que não foi dimensionada ou teve quaisquer valores atribuídos a ela. Por exemplo:
Dim arr() As String
Uma matriz de comprimento zero é declarada com uma dimensão de -1. Por exemplo:
Dim arrZ(-1) As String
Talvez seja necessário criar uma matriz de comprimento zero nas seguintes circunstâncias:
Sem arriscar uma NullReferenceException exceção, o seu código deve acessar membros da Array classe, como Length ou Rank, ou chamar uma função Visual Basic como UBound.
Você quer manter seu código simples, não tendo que verificar
Nothingcomo um caso especial.Seu código interage com uma interface de programação de aplicativo (API) que exige que você passe uma matriz de comprimento zero para um ou mais procedimentos ou retorna uma matriz de comprimento zero de um ou mais procedimentos.
Dividindo uma matriz
Em alguns casos, talvez seja necessário dividir uma única matriz em várias matrizes. Isso envolve identificar o ponto ou pontos em que a matriz deve ser dividida e, em seguida, dividir a matriz em duas ou mais matrizes separadas.
Observação
Esta seção não discute a divisão de uma única cadeia de caracteres em uma matriz de cadeia de caracteres com base em algum delimitador. Para obter informações sobre como dividir uma cadeia de caracteres, consulte o String.Split método.
Os critérios mais comuns para dividir uma matriz são:
O número de elementos na matriz. Por exemplo, talvez você queira dividir uma matriz de mais de um número especificado de elementos em um número de partes aproximadamente iguais. Para esse propósito, você pode usar o valor retornado pelo Array.Length método ou Array.GetLength .
O valor de um elemento, que serve como um delimitador que indica onde a matriz deve ser dividida. Você pode pesquisar um valor específico chamando os Array.FindIndex métodos e Array.FindLastIndex .
Depois de determinar o índice ou índices nos quais a matriz deve ser dividida, você pode criar as matrizes individuais chamando o Array.Copy método.
O exemplo a seguir divide uma matriz em duas matrizes de tamanho aproximadamente igual. (Se o número total de elementos da matriz for ímpar, a primeira matriz terá um elemento a mais do que a segunda.)
Module Example
Public Sub Main()
' Create an array of 100 elements.
Dim arr(99) As Integer
' Populate the array.
Dim rnd As new Random()
For ctr = 0 To arr.GetUpperBound(0)
arr(ctr) = rnd.Next()
Next
' Determine how many elements should be in each array.
Dim divisor = 2
Dim remainder As Integer
Dim boundary = Math.DivRem(arr.GetLength(0), divisor, remainder)
' Copy the array.
Dim arr1(boundary - 1 + remainder), arr2(boundary - 1) as Integer
Array.Copy(arr, 0, arr1, 0, boundary + remainder)
Array.Copy(arr, boundary + remainder, arr2, 0, arr.Length - boundary)
End Sub
End Module
O exemplo a seguir divide uma matriz de cadeia de caracteres em duas matrizes com base na presença de um elemento cujo valor é "zzz", que serve como o delimitador de matriz. As novas matrizes não incluem o elemento que contém o delimitador.
Module Example
Public Sub Main()
Dim rnd As New Random()
' Create an array of 100 elements.
Dim arr(99) As String
' Populate each element with an arbitrary ASCII character.
For ctr = 0 To arr.GetUpperBound(0)
arr(ctr) = ChrW(Rnd.Next(&h21, &h7F))
Next
' Get a random number that will represent the point to insert the delimiter.
arr(rnd.Next(0, arr.GetUpperBound(0))) = "zzz"
' Find the delimiter.
Dim location = Array.FindIndex(arr, Function(x) x = "zzz")
' Create the arrays.
Dim arr1(location - 1) As String
Dim arr2(arr.GetUpperBound(0) - location - 1) As String
' Populate the two arrays.
Array.Copy(arr, 0, arr1, 0, location)
Array.Copy(arr, location + 1, arr2, 0, arr.GetUpperBound(0) - location)
End Sub
End Module
Unir matrizes
Você também pode combinar vários arrays em um único array maior. Para fazer isso, você também usa o Array.Copy método.
Observação
Esta seção não discute a junção de uma matriz de cadeia de caracteres em uma única cadeia de caracteres. Para obter informações sobre como unir uma matriz de cadeia de caracteres, consulte o String.Join método.
Antes de copiar os elementos de cada matriz para a nova matriz, você deve primeiro garantir que inicializou a matriz para que ela seja grande o suficiente para acomodar a nova matriz. Você pode fazer isso de duas maneiras:
- Use a
ReDim Preserveinstrução para expandir dinamicamente a matriz antes de adicionar novos elementos a ela. Essa é a técnica mais fácil, mas pode resultar em degradação do desempenho e consumo excessivo de memória quando você copia grandes matrizes. - Calcule o número total de elementos necessários para a nova matriz grande e, em seguida, adicione os elementos de cada matriz de origem a ela.
O exemplo a seguir usa a segunda abordagem para adicionar quatro matrizes com dez elementos cada a uma única matriz.
Imports System.Collections.Generic
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim tasks As New List(Of Task(Of Integer()))
' Generate four arrays.
For ctr = 0 To 3
Dim value = ctr
tasks.Add(Task.Run(Function()
Dim arr(9) As Integer
For ndx = 0 To arr.GetUpperBound(0)
arr(ndx) = value
Next
Return arr
End Function))
Next
Task.WaitAll(tasks.ToArray())
' Compute the number of elements in all arrays.
Dim elements = 0
For Each task In tasks
elements += task.Result.Length
Next
Dim newArray(elements - 1) As Integer
Dim index = 0
For Each task In tasks
Dim n = task.Result.Length
Array.Copy(task.Result, 0, newArray, index, n)
index += n
Next
Console.WriteLine($"The new array has {newArray.Length} elements.")
End Sub
End Module
' The example displays the following output:
' The new array has 40 elements.
Como neste caso as matrizes de origem são todas pequenas, também podemos expandir dinamicamente a matriz à medida que adicionamos os elementos de cada nova matriz a ela. O exemplo a seguir faz isso.
Imports System.Collections.Generic
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim tasks As New List(Of Task(Of Integer()))
' Generate four arrays.
For ctr = 0 To 3
Dim value = ctr
tasks.Add(Task.Run(Function()
Dim arr(9) As Integer
For ndx = 0 To arr.GetUpperBound(0)
arr(ndx) = value
Next
Return arr
End Function))
Next
Task.WaitAll(tasks.ToArray())
' Dimension the target array and copy each element of each source array to it.
Dim newArray() As Integer = {}
' Define the next position to copy to in newArray.
Dim index = 0
For Each task In tasks
Dim n = Task.Result.Length
ReDim Preserve newArray(newArray.GetUpperBound(0) + n)
Array.Copy(task.Result, 0, newArray, index, n)
index += n
Next
Console.WriteLine($"The new array has {newArray.Length} elements.")
End Sub
End Module
' The example displays the following output:
' The new array has 40 elements.
Coleções como alternativa aos arrays
As matrizes são mais úteis para criar e trabalhar com um número fixo de objetos fortemente tipados. As coleções fornecem uma maneira mais flexível de trabalhar com grupos de objetos. Ao contrário dos arrays, que exigem que você altere explicitamente o tamanho de um array com a instrução ReDimStatement, as coleções crescem e diminuem dinamicamente à medida que as necessidades de uma aplicação mudam.
Quando você usa ReDim para redimensionar uma matriz, o Visual Basic cria uma nova matriz e libera a anterior. Isso requer tempo de execução. Portanto, se o número de itens com os quais você está trabalhando muda com freqüência ou você não pode prever o número máximo de itens necessários, geralmente obterá um melhor desempenho usando uma coleção.
Para algumas coleções, você pode atribuir uma chave a qualquer objeto colocado na coleção para que possa recuperar rapidamente o objeto usando a chave.
Se sua coleção contiver elementos de apenas um tipo de dados, você poderá usar uma das classes no System.Collections.Generic namespace. Uma coleção genérica impõe segurança de tipo para que nenhum outro tipo de dados possa ser adicionado a ela.
Para obter mais informações sobre coleções, consulte Coleções.
Tópicos relacionados
| Período | Definição |
|---|---|
| Dimensões de matriz no Visual Basic | Explica a classificação e as 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 no Visual Basic | Mostra como classificar os elementos de uma matriz em ordem alfabética. |
| Como: Atribuir uma matriz a outra matriz | Descreve as regras e etapas para atribuir uma matriz a outra variável de matriz. |
| Resolução de problemas de matrizes | Discute alguns problemas comuns que surgem ao trabalhar com matrizes. |