Delen via


Matrices in Visual Basic

Een matrix is een reeks waarden, die worden aangeduid als elementen die logisch aan elkaar zijn gerelateerd. Een array kan bijvoorbeeld bestaan uit het aantal leerlingen in elke klas van een basisschool; elk element van de array is het aantal leerlingen in één klas. Op dezelfde manier kan een matrix bestaan uit de cijfers van een leerling/student voor een klas; elk element van de matrix is één cijfer.

Het is mogelijk om afzonderlijke variabelen te gebruiken om elk van onze gegevensitems op te slaan. Als onze toepassing bijvoorbeeld cijfers van leerlingen/studenten analyseert, kunnen we een afzonderlijke variabele gebruiken voor het cijfer van elke leerling/student, zoals englishGrade1englishGrade2, enzovoort. Deze aanpak heeft drie belangrijke beperkingen:

  • We moeten bij het ontwerpen precies weten hoeveel beoordelingen we moeten verwerken.
  • Het verwerken van grote aantallen cijfers wordt snel lastig. Hierdoor heeft een toepassing veel meer kans op ernstige bugs.
  • Het is moeilijk te onderhouden. Voor elk nieuw niveau dat we toevoegen, moet de toepassing worden gewijzigd, opnieuw worden gecompileerd en opnieuw worden geïmplementeerd.

Met behulp van een matrix kunt u naar deze gerelateerde waarden verwijzen met dezelfde naam en een getal gebruiken dat een index of subscript wordt genoemd om een afzonderlijk element te identificeren op basis van de positie in de matrix. De indexen van een array variëren van 0 tot een minder dan het totale aantal elementen in de array. Wanneer u visual Basic-syntaxis gebruikt om de grootte van een matrix te definiëren, geeft u de hoogste index op, niet het totale aantal elementen in de matrix. U kunt met de reeks als een eenheid werken en de mogelijkheid om de elementen ervan te itereren, bevrijdt u van het hoeven weten hoeveel elementen deze tijdens de ontwerptijd precies bevat.

Enkele snelle voorbeelden voor uitleg:

' 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)() {}

Matrixelementen in een eenvoudige matrix

We gaan een matrix maken met de naam students voor het opslaan van het aantal leerlingen/studenten in elke klas in een grammaticaschool. De indexen van de elementen variëren van 0 tot en met 6. Het gebruik van deze matrix is eenvoudiger dan zeven variabelen declareren.

In de volgende afbeelding ziet u de students matrix. Voor elk element van de matrix:

  • De index van het element vertegenwoordigt het leerjaar (index 0 vertegenwoordigt de kleuterklas).

  • De waarde die in het element is opgenomen, vertegenwoordigt het aantal leerlingen in die klas.

Diagram met een matrix van het aantal leerlingen/studenten

Het volgende voorbeeld bevat de Visual Basic-code die de matrix maakt en gebruikt:


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

In het voorbeeld worden drie dingen uitgevoerd:

  • Het declareert een students matrix met zeven elementen. Het getal 6 in de matrixdeclaratie geeft de laatste index in de matrix aan; het is één kleiner dan het aantal elementen in de matrix.
  • Hiermee worden waarden toegewezen aan elk element in de matrix. Matrixelementen worden geopend met behulp van de matrixnaam en inclusief de index van het afzonderlijke element tussen haakjes.
  • Hierin wordt elke waarde van de matrix weergegeven. In het voorbeeld wordt een For instructie gebruikt voor toegang tot elk element van de matrix op basis van het indexnummer.

De students matrix in het voorgaande voorbeeld is een eendimensionale matrix omdat er één index wordt gebruikt. Een matrix die meer dan één index of subscript gebruikt, wordt multidimensionaal genoemd. Zie de rest van dit artikel en Matrixdimensies in Visual Basic voor meer informatie.

Een array maken

U kunt de grootte van een matrix op verschillende manieren definiëren:

  • U kunt de grootte opgeven wanneer de matrix wordt gedeclareerd:

    ' 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 String
    
  • U kunt een New component gebruiken om de grootte van een matrix op te geven wanneer deze wordt gemaakt:

    ' 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)() {}
    

Als u een bestaande matrix hebt, kunt u de grootte opnieuw definiëren met behulp van de ReDim instructie. U kunt opgeven dat de ReDim instructie de waarden in de matrix bewaart of u kunt opgeven dat er een lege matrix wordt gemaakt. In het volgende voorbeeld ziet u verschillende toepassingen van de ReDim instructie om de grootte van een bestaande matrix te wijzigen.

' 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)

Zie de ReDim-instructie voor meer informatie.

Waarden opslaan in een matrix

U kunt elke locatie in een matrix openen met behulp van een index van het type Integer. U kunt waarden opslaan en ophalen in een matrix door te verwijzen naar elke matrixlocatie met behulp van de index tussen haakjes. Indexen voor multidimensionale matrices worden gescheiden door komma's (,). U hebt één index nodig voor elke matrixdimensie.

In het volgende voorbeeld ziet u enkele instructies waarmee waarden in matrices worden opgeslagen en opgehaald.


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

Een array vullen met array-literal

Door een letterlijke matrix te gebruiken, kunt u een matrix vullen met een initiële set waarden op hetzelfde moment dat u deze maakt. Een letterlijke matrix bestaat uit een lijst met door komma's gescheiden waarden die tussen accolades ({}) staan.

Wanneer u een matrix maakt met behulp van een letterlijke matrix, kunt u het matrixtype opgeven of typedeductie gebruiken om het matrixtype te bepalen. In het volgende voorbeeld ziet u beide opties.

' 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 }

Wanneer u typedeductie gebruikt, wordt het type van de matrix bepaald door het dominante type in de lijst met letterlijke waarden. Het dominante type is het type waarop alle andere typen in de matrix kunnen worden uitgebreid. Als dit unieke type niet kan worden bepaald, is het dominante type het unieke type waarmee alle andere typen in de matrix kunnen worden beperkt. Als geen van deze unieke typen kan worden bepaald, is Objecthet dominante type . Bijvoorbeeld, als de lijst met waarden die aan het matrixliteral zijn opgegeven waarden van het type Integer, Long, en Double bevat, is de resulterende matrix van het type Double. Omdat Integer en Long slechts breder worden tot Double, is Double het dominante type. Zie verbredings- en vernauwingsconversies voor meer informatie.

Opmerking

U kunt alleen typedeductie gebruiken voor matrices die zijn gedefinieerd als lokale variabelen in een typelid. Als er een expliciete typedefinitie ontbreekt, zijn arrays die gedefinieerd zijn met array-literals op klasseniveau van het type Object[]. Zie Deductie van het lokale type voor meer informatie.

In het vorige voorbeeld wordt values gedefinieerd als een array van het type Double, hoewel alle arrayletters van het type Integer zijn. U kunt deze matrix maken omdat de waarden in de letterlijke matrix kunnen worden uitgebreid naar Double waarden.

U kunt ook een multidimensionale array maken en vullen met behulp van geneste array-literals. Geneste array-literalen moeten een aantal dimensies hebben die consistent zijn met de resulterende array. In het volgende voorbeeld wordt een tweedimensionale matrix met gehele getallen gemaakt met behulp van letterlijke waarden van geneste matrices.

' 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}}

Wanneer u geneste array-literals gebruikt om een array te maken en in te vullen, treedt er een fout op als het aantal elementen in de geneste array-literals niet overeenkomt. Er treedt ook een fout op als u de arrayvariabele expliciet declareert voor een ander aantal dimensies dan de array-literals.

Net zoals u dat voor eendimensionale tabellen kunt doen, kunt u vertrouwen op type-inferentie bij het maken van een multidimensionale tabel met geneste letterlijke tabellen. Het afgeleid type is het dominante type voor alle waarden in alle letterlijke matrixwaarden voor alle nestingsniveaus. In het volgende voorbeeld wordt een tweedimensionale matrix van het type gemaakt Double[,] op basis van waarden van het type Integer en Double.

Dim arr = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}

Zie Procedure: Een matrixvariabele initialiseren in Visual Basic voor meer voorbeelden.

Itereren door een array

Wanneer u een matrix doorloopt, opent u elk element in de matrix van de laagste index naar het hoogste of van het hoogste naar het laagste. Gebruik normaal gesproken de For...Next-instructie of de For Each...Next-instructie om de elementen van een array te doorlopen. Wanneer u de bovengrenzen van de matrix niet kent, kunt u de Array.GetUpperBound methode aanroepen om de hoogste waarde van de index op te halen. Hoewel de laagste indexwaarde bijna altijd 0 is, kunt u de Array.GetLowerBound methode aanroepen om de laagste waarde van de index op te halen.

In het volgende voorbeeld wordt een eendimensionale array doorlopen met behulp van de For...Next instructie.


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

In het volgende voorbeeld wordt een multidimensionale array doorlopen door middel van een For...Next instructie. De GetUpperBound methode heeft een parameter die de dimensie aangeeft. GetUpperBound(0) retourneert de hoogste index van de eerste dimensie en GetUpperBound(1) retourneert de hoogste index van de tweede dimensie.


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

In het volgende voorbeeld wordt een For Each...Next Statement gebruikt om een eendimensionale array en een tweedimensionale array te doorlopen.


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

Matrixgrootte

De grootte van een matrix is het product van de lengten van alle afmetingen. Het vertegenwoordigt het totale aantal elementen dat momenteel in de matrix is opgenomen. In het volgende voorbeeld wordt bijvoorbeeld een 2dimensionale matrix met vier elementen in elke dimensie declareren. Zoals de uitvoer uit het voorbeeld laat zien, is de grootte van de array 16 (of (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

Opmerking

Deze bespreking van de matrixgrootte is niet van toepassing op onregelmatige matrices. Zie de sectie Gelabelde matrices voor informatie over gelabelde matrices en het bepalen van de grootte van een gelabelde matrix.

U kunt de grootte van een matrix vinden met behulp van de Array.Length eigenschap. U kunt de lengte van elke dimensie van een multidimensionale matrix vinden met behulp van de Array.GetLength methode.

U kunt het formaat van een matrixvariabele wijzigen door er een nieuw matrixobject aan toe te wijzen of door de ReDim instructie te gebruiken. In het volgende voorbeeld wordt de ReDim instructie gebruikt om een matrix met 100 elementen te wijzigen in een matrix met 51 elementen.


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

 

Er zijn verschillende dingen waarmee u rekening moet houden bij het omgaan met de grootte van een matrix.

Opmerkingen
Maatlijnlengte De index van elke dimensie is gebaseerd op 0, wat betekent dat deze varieert van 0 tot de bovengrens. Daarom is de lengte van een bepaalde dimensie één groter dan de opgegeven bovengrens van die dimensie.
Lengtelimieten De lengte van elke dimensie van een matrix is beperkt tot de maximumwaarde van het Integer gegevenstype, ofwel Int32.MaxValue (2 ^ 31) - 1. De totale grootte van een matrix wordt echter ook beperkt door het geheugen dat beschikbaar is op uw systeem. Als u probeert een matrix te initialiseren die de hoeveelheid beschikbaar geheugen overschrijdt, genereert de runtime een OutOfMemoryException.
Grootte en elementgrootte De grootte van een matrix is onafhankelijk van het gegevenstype van de elementen. De grootte vertegenwoordigt altijd het totale aantal elementen, niet het aantal bytes dat ze in het geheugen verbruiken.
Geheugenverbruik Het is niet veilig om veronderstellingen te maken met betrekking tot hoe een matrix wordt opgeslagen in het geheugen. Opslag varieert op platforms met verschillende gegevensbreedten, zodat dezelfde matrix meer geheugen kan verbruiken op een 64-bits systeem dan op een 32-bits systeem. Afhankelijk van de systeemconfiguratie wanneer u een matrix initialiseert, kan de Common Language Runtime (CLR) opslag toewijzen om elementen zo dicht mogelijk bij elkaar te verpakken of om ze allemaal op natuurlijke hardwaregrenzen uit te lijnen. Een matrix vereist ook een opslagoverhead voor de controle-informatie en deze overhead neemt toe met elke toegevoegde dimensie.

Het arraytype

Elke matrix heeft een gegevenstype, wat verschilt van het gegevenstype van de elementen. Er is geen enkel gegevenstype voor alle matrices. In plaats daarvan wordt het gegevenstype van een matrix bepaald door het aantal dimensies of rangschikkingen van de matrix en het gegevenstype van de elementen in de matrix. Twee matrixvariabelen zijn alleen van hetzelfde gegevenstype wanneer ze dezelfde rang hebben en hun elementen hetzelfde gegevenstype hebben. De lengte van de dimensies van een matrix heeft geen invloed op het gegevenstype van de matrix.

Elke matrix neemt over van de System.Array klasse en u kunt een variabele declareren om van het type Arrayte zijn, maar u kunt geen matrix van het type Arraymaken. Hoewel de volgende code bijvoorbeeld de variabele van het type arr declareert en de methode Array aanroept om de array te creëren, blijkt het type van de array Object[] te zijn.


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[]

De ReDim-instructie kan ook niet worden uitgevoerd op een variabele die is gedeclareerd als type Array. Om deze redenen en voor typeveiligheid is het raadzaam om elke matrix als een specifiek type te declareren.

U kunt het gegevenstype van een matrix of de bijbehorende elementen op verschillende manieren achterhalen.

  • U kunt de GetType methode voor de variabele aanroepen om een Type object op te halen dat het runtimetype van de variabele vertegenwoordigt. Het Type object bevat uitgebreide informatie in de eigenschappen en methoden.
  • U kunt de variabele doorgeven aan de TypeName functie om een String met de naam van het runtimetype op te halen.

In het volgende voorbeeld worden zowel de GetType methode als de TypeName functie aangeroepen om het type matrix te bepalen. Het matrixtype is Byte(,). Houd er rekening mee dat de Type.BaseType eigenschap ook aangeeft dat het basistype van de bytematrix de Array klasse is.


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(,)


Matrices als retourwaarden en -parameters

Als u een matrix wilt retourneren uit een Function procedure, geeft u het gegevenstype van de matrix en het aantal dimensies op als het retourtype van de functie-instructie. Declareer binnen de functie een lokale matrixvariabele met hetzelfde gegevenstype en hetzelfde aantal dimensies. Neem in de return-uitspraak de lokale arrayvariabele zonder haakjes op.

Als u een matrix wilt opgeven als parameter voor een Sub of Function procedure, definieert u de parameter als een matrix met een opgegeven gegevenstype en het aantal dimensies. Geef in de aanroep van de procedure een matrixvariabele door met hetzelfde gegevenstype en hetzelfde aantal dimensies.

In het volgende voorbeeld retourneert de GetNumbers functie een Integer()eendimensionale matrix van het type Integer. De ShowNumbers procedure accepteert een Integer() argument.


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
    

In het volgende voorbeeld retourneert de GetNumbersMultiDim functie een Integer(,), een tweedimensionale matrix van het type Integer. De ShowNumbersMultiDim procedure accepteert een Integer(,) argument.


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

Getrapte arrays

Soms is de gegevensstructuur in uw toepassing tweedimensionaal, maar niet rechthoekig. U kunt bijvoorbeeld een matrix gebruiken om gegevens over de hoge temperatuur van elke dag van de maand op te slaan. De eerste dimensie van de matrix vertegenwoordigt de maand, maar de tweede dimensie vertegenwoordigt het aantal dagen en het aantal dagen in een maand is niet uniform. Een onregelmatige matrix, ook wel een matrix van matrices genoemd, is ontworpen voor dergelijke scenario's. Een gekartelde array is een array waarvan de elementen ook arrays zijn. Een gelabelde matrix en elk element in een gelabelde matrix kan een of meer dimensies hebben.

In het volgende voorbeeld wordt een matrix van maanden gebruikt, waarvan elk element een matrix van dagen is. In het voorbeeld wordt een onregelmatige array gebruikt, omdat verschillende maanden een verschillend aantal dagen hebben. In het voorbeeld ziet u hoe u een gelabelde matrix maakt, er waarden aan toewijst en de waarden ervan ophaalt en weergeeft.

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

In het vorige voorbeeld worden waarden toegewezen aan de gesegmenteerde array op basis van een element voor element met behulp van een For...Next lus. U kunt ook waarden toewijzen aan de elementen van een gelabelde matrix met behulp van letterlijke waarden van geneste matrices. De poging om een geneste array-literal te gebruiken (bijvoorbeeld Dim valuesjagged = {{1, 2}, {2, 3, 4}}) veroorzaakt echter compilerfout BC30568. Als u de fout wilt corrigeren, plaatst u de letterlijke waarde van de binnenste matrix tussen haakjes. Met de haakjes wordt de letterlijke expressie van de array geëvalueerd en worden de resulterende waarden gebruikt met de letterlijke waarde van de buitenste array, zoals het volgende voorbeeld laat zien.


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

Een jagged array is een eendimensionale array waarvan de elementen arrays bevatten. De eigenschap Array.Length en de methode Array.GetLength(0) retourneren daarom het aantal elementen in de eendimensionale array, en Array.GetLength(1) genereert een IndexOutOfRangeException omdat een onregelmatige array niet multidimensionaal is. U bepaalt het aantal elementen in elke submaarray door de waarde van de eigenschap van elke submaarray Array.Length op te halen. Het volgende voorbeeld laat zien hoe u het aantal elementen in een ongelijkmatige array kunt bepalen.


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

Matrices met lengte nul

Visual Basic maakt onderscheid tussen een niet-geïnitialiseerde matrix (een matrix waarvan de waarde is Nothing) en een matrix met lengte nul of een lege matrix (een matrix die geen elementen bevat.) Een niet-geïnitialiseerde matrix is een matrix die niet is gedimensioneerd of waaraan waarden zijn toegewezen. Voorbeeld:

Dim arr() As String

Een matrix met lengte nul wordt gedeclareerd met een dimensie van -1. Voorbeeld:

Dim arrZ(-1) As String

Mogelijk moet u een matrix met lengte nul maken onder de volgende omstandigheden:

  • Zonder een NullReferenceException uitzondering te riskeren, moet uw code toegang hebben tot leden van de Array klasse, zoals Length of Rank, of een Visual Basic-functie aanroepen, zoals UBound.

  • U wilt uw code eenvoudig houden door niet te hoeven controleren op Nothing als een speciaal geval.

  • Uw code communiceert met een API (Application Programming Interface) waarvoor u een matrix met lengte nul moet doorgeven aan een of meer procedures of een matrix met lengte nul retourneert uit een of meer procedures.

Een array splitsen

In sommige gevallen moet u mogelijk één matrix splitsen in meerdere matrices. Dit omvat het identificeren van het punt of de punten waarop de matrix moet worden gesplitst en vervolgens de matrix in twee of meer afzonderlijke matrices te splitsen.

Opmerking

In deze sectie wordt niet besproken hoe u één tekenreeks splitst in een tekenreeksmatrix op basis van een scheidingsteken. Zie de String.Split methode voor meer informatie over het splitsen van een tekenreeks.

De meest voorkomende criteria voor het splitsen van een matrix zijn:

  • Het aantal elementen in de matrix. U kunt bijvoorbeeld een matrix van meer dan een opgegeven aantal elementen splitsen in een aantal ongeveer gelijke delen. Voor dit doel kunt u de waarde gebruiken die wordt geretourneerd door de Array.Length of Array.GetLength methode.

  • De waarde van een element, dat fungeert als scheidingsteken dat aangeeft waar de matrix moet worden gesplitst. U kunt zoeken naar een specifieke waarde door de Array.FindIndex en Array.FindLastIndex methoden aan te roepen.

Zodra u de index of indexen hebt bepaald waarop de matrix moet worden gesplitst, kunt u vervolgens de afzonderlijke matrices maken door de Array.Copy methode aan te roepen.

In het volgende voorbeeld wordt een matrix gesplitst in twee matrices van ongeveer gelijke grootte. (Als het totale aantal matrixelementen oneven is, heeft de eerste matrix één element meer dan de tweede.)


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

In het volgende voorbeeld wordt een tekenreeksmatrix gesplitst in twee matrices op basis van de aanwezigheid van een element waarvan de waarde 'zzz' is, dat fungeert als het scheidingsteken van de matrix. De nieuwe matrices bevatten niet het element dat het scheidingsteken bevat.


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

Matrices samenvoegen

U kunt ook een aantal matrices combineren tot één grotere matrix. Hiervoor gebruikt u ook de Array.Copy methode.

Opmerking

In deze sectie wordt het samenvoegen van een tekenreeksmatrix niet in één tekenreeks besproken. Zie de String.Join methode voor meer informatie over het samenvoegen van een tekenreeksmatrix.

Voordat u de elementen van elke matrix naar de nieuwe matrix kopieert, moet u eerst ervoor zorgen dat u de matrix hebt geïnitialiseerd, zodat deze groot genoeg is om de nieuwe matrix te kunnen gebruiken. U kunt dit op twee manieren doen:

  • Gebruik de ReDim Preserve instructie om de matrix dynamisch uit te breiden voordat u er nieuwe elementen aan toevoegt. Dit is de eenvoudigste techniek, maar dit kan leiden tot prestatievermindering en overmatig geheugenverbruik wanneer u grote matrices kopieert.
  • Bereken het totale aantal elementen dat nodig is voor de nieuwe grote matrix en voeg vervolgens de elementen van elke bronmatrix eraan toe.

In het volgende voorbeeld wordt de tweede benadering gebruikt om vier matrices met elk tien elementen toe te voegen aan één matrix.

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.

Aangezien in dit geval de bronmatrices allemaal klein zijn, kunnen we de matrix ook dynamisch uitbreiden terwijl we de elementen van elke nieuwe matrix eraan toevoegen. Het volgende voorbeeld doet dat.

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.

Verzamelingen als alternatief voor matrices

Arrays zijn vooral handig voor het creëren en gebruiken van een vast aantal sterk getypeerde objecten. Verzamelingen bieden een flexibelere manier om te werken met groepen objecten. In tegenstelling tot matrices, die vereisen dat u de grootte van een matrix expliciet wijzigt met de ReDim instructie, groeien verzamelingen dynamisch naarmate de behoeften van een toepassing veranderen.

Wanneer u ReDim gebruikt om een matrix opnieuw te dimensioneren, maakt Visual Basic een nieuwe matrix aan, waardoor de vorige wordt vrijgegeven. Dit kost uitvoeringstijd. Als het aantal items waarmee u werkt vaak verandert, of als u het maximale aantal items dat u nodig hebt niet kunt voorspellen, kunt u meestal betere prestaties verkrijgen door gebruik te maken van een collectie.

Voor sommige verzamelingen kunt u een sleutel toewijzen aan elk object dat u in de verzameling plaatst, zodat u het object snel kunt ophalen met behulp van de sleutel.

Als uw verzameling elementen van slechts één gegevenstype bevat, kunt u een van de klassen in de System.Collections.Generic naamruimte gebruiken. Een algemene verzameling dwingt typeveiligheid af, zodat er geen ander gegevenstype aan kan worden toegevoegd.

Zie Verzamelingen voor meer informatie over verzamelingen.

Termijn Definitie
Matrixdimensies in Visual Basic Legt uit wat rang en dimensies in arrays zijn.
Procedure: Een matrixvariabele initialiseren in Visual Basic Hierin wordt beschreven hoe u matrices vult met initiële waarden.
Procedure: Een matrix sorteren in Visual Basic Laat zien hoe u de elementen van een matrix alfabetisch sorteert.
Procedure: Eén matrix toewijzen aan een andere matrix Beschrijft de regels en stappen voor het toewijzen van een matrix aan een andere matrixvariabele.
Problemen met matrices oplossen Hier worden enkele veelvoorkomende problemen besproken die zich voordoen bij het werken met matrices.

Zie ook