Delen via


Matrices in Visual Basic

Een matrix is een set waarden, die termen bevatten die logisch aan elkaar zijn gerelateerd. Een matrix kan bijvoorbeeld bestaan uit het aantal leerlingen/studenten in elk cijfer in een grammaticaschool; elk element van de matrix is het aantal leerlingen/studenten in één cijfer. 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 englishGrade1, englishGrade2enzovoort. Deze aanpak heeft drie belangrijke beperkingen:

  • We moeten precies weten hoeveel cijfers we moeten verwerken.
  • Het verwerken van grote aantallen cijfers wordt snel onhandig. Hierdoor heeft een toepassing veel meer kans op ernstige fouten.
  • Het is moeilijk te onderhouden. Voor elk nieuw cijfer 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 matrixbereik van 0 tot één kleiner dan het totale aantal elementen in de matrix. 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 matrix als eenheid werken en de mogelijkheid om de elementen ervan te herhalen, zodat u precies weet hoeveel elementen deze in het ontwerptijd 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

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

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

  • De index van het element vertegenwoordigt het cijfer (index 0 vertegenwoordigt kleuterschool).

  • De waarde die in het element is opgenomen, vertegenwoordigt het aantal leerlingen/studenten in dat cijfer.

Diagram showing an array of the numbers of students

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:

  • Er wordt een students matrix met zeven elementen declareren. Het getal 6 in de declaratie van de matrix geeft de laatste index in de matrix aan; het is een 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 met inbegrip van 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 matrix 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 behoudt 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 in een matrix opslaan en ophalen 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 waarin 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 matrix vullen met letterlijke matrix

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 tussen accolades ({}).

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 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 waarop alle andere typen in de matrix kunnen worden beperkt. Als geen van deze unieke typen kan worden bepaald, is Objecthet dominante type . Als de lijst met waarden die zijn opgegeven aan de letterlijke matrix bijvoorbeeld waarden van het type IntegerLongbevat, en Doublede resulterende matrix van het type Doubleis. Omdat Integer en Long verbreed tot Double, Double is het dominante type. Zie Widening and Narrowing Conversions (Widening and Narrowing Conversions) voor meer informatie.

Notitie

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

Houd er rekening mee dat het vorige voorbeeld definieert values als een matrix van het type Double , ook al zijn alle letterlijke matrixen van het type Integer. U kunt deze matrix maken omdat de waarden in de letterlijke matrix kunnen worden uitgebreid tot Double waarden.

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

' 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 letterlijke matrix gebruikt om een matrix te maken en in te vullen, treedt er een fout op als het aantal elementen in de letterlijke waarde van de geneste matrix niet overeenkomt. Er treedt ook een fout op als u de matrixvariabele expliciet declareert voor een ander aantal dimensies dan de letterlijke matrix.

Net zoals u kunt voor eendimensionale matrices, kunt u vertrouwen op typedeductie bij het maken van een multidimensionale matrix met geneste letterlijke matrixen. Het uitgestelde type is het dominante type voor alle waarden in alle letterlijke matrixwaarden voor alle geneste niveaus. 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 voor meer voorbeelden: Een matrixvariabele initialiseren in Visual Basic.

Herhalen via een matrix

Wanneer u een matrix doorloopt, opent u elk element in de matrix van de laagste index naar de hoogste of van de hoogste naar de laagste. Gebruik normaal gesproken de For... Volgende instructie of voor elke... Volgende instructie om de elementen van een matrix 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 matrix herhaald 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 matrix herhaald met behulp 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 gebruikt... Next Statementto iterate through a one-dimensional array and a two-dimensional array.


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 tweedimensionale matrix met vier elementen in elke dimensie declareren. Zoals de uitvoer uit het voorbeeld laat zien, is de grootte van de matrix 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

Notitie

Deze bespreking van matrixgrootte is niet van toepassing op onregelmatige matrices. Zie de sectie Jagged-matrices voor informatie over onregelmatige matrices en het bepalen van de grootte van een matrix met jagged.

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 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.

Notities
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 de manier waarop een matrix wordt opgeslagen in het geheugen. Storage verschilt per platform 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 aan het inpakken van elementen zo dicht mogelijk, 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 matrixtype

Elke matrix heeft een gegevenstype, dat 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 hebben slechts hetzelfde gegevenstype als ze dezelfde rangschikking 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 de System.Array klasse over en u kunt een variabele declareren als type Array, maar u kunt geen matrix van het type Arraymaken. Hoewel de volgende code bijvoorbeeld de arr variabele van het type Array declareert en de methode aanroept om de Array.CreateInstance matrix te instantiëren, blijkt het type van de matrix 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(,). Type.BaseType De eigenschap geeft ook aan 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 uit een Function procedure wilt retourneren, geeft u het gegevenstype 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-instructie de lokale matrixvariabele 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(,)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

Gelabelde matrices

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 onregelmatige matrix is een matrix waarvan de elementen ook matrices zijn. Een matrix met jagged en elk element in een matrix met een jagged kunnen 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 matrix met jagged gebruikt omdat verschillende maanden verschillende aantallen dagen hebben. In het voorbeeld ziet u hoe u een matrix met een jagged 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 matrix met jaggeds op basis van een element-by-element met behulp van een For...Next lus. U kunt ook waarden toewijzen aan de elementen van een onregelmatige matrix met behulp van letterlijke waarden van geneste matrices. De poging om geneste letterlijke matrix te gebruiken (bijvoorbeeld Dim valuesjagged = {{1, 2}, {2, 3, 4}}) genereert echter compilerfout BC30568. Als u de fout wilt corrigeren, plaatst u de letterlijke letterlijke binnenste matrix tussen haakjes. De haakjes dwingen af dat de letterlijke expressie van de matrix wordt geëvalueerd en de resulterende waarden worden gebruikt met de letterlijke waarde van de buitenste matrix, zoals in het volgende voorbeeld wordt weergegeven.


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 onregelmatige matrix is een eendimensionale matrix waarvan de elementen matrices bevatten. Array.Length De eigenschap en de Array.GetLength(0) methode retourneren daarom het aantal elementen in de eendimensionale matrix en Array.GetLength(1) genereert een IndexOutOfRangeException omdat een onregelmatige matrix 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. In het volgende voorbeeld ziet u hoe u het aantal elementen in een matrix met jagged 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 isNothing) en een matrix met lengte nul of een lege matrix (een matrix zonder elementen.) Een niet-geïnitialiseerde matrix is een matrix die niet is gedimensioneerd of waaraan geen waarden zijn toegewezen. Bijvoorbeeld:

Dim arr() As String

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

Dim arrZ(-1) As String

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

  • 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 Nothing op 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 moet retourneren uit een of meer procedures.

Een matrix 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 het vervolgens spugen van de matrix in twee of meer afzonderlijke matrices.

Notitie

In deze sectie wordt het splitsen van één tekenreeks in een tekenreeksmatrix niet besproken 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 indexen of indexen hebt bepaald waarop de matrix moet worden gesplitst, kunt u 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, die fungeert als het scheidingsteken voor 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.

Notitie

In deze sectie wordt het samenvoegen van een tekenreeksmatrix niet besproken in één tekenreeks. 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 aan te passen. U kunt dit op twee manieren doen:

  • Gebruik de ReDim Preserve instructie om de matrix dynamisch uit te vouwen 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 methode 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. In het volgende voorbeeld doet u 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

Matrices zijn het handigst voor het maken en werken met een vast aantal sterk getypte objecten. Verzamelingen bieden een flexibelere manier om met groepen objecten te werken. 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 een matrix opnieuw wiltdimensioneren, maakt Visual Basic een nieuwe matrix en wordt de vorige vrijgegeven. Dit kost uitvoeringstijd. Als het aantal items waarmee u vaak werkt, of als u het maximum aantal items dat u nodig hebt niet kunt voorspellen, krijgt u meestal betere prestaties met behulp van een verzameling.

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 Uitleg over rang en dimensies in matrices.
Procedure: Een matrixvariabele initialiseren in Visual Basic Beschrijft hoe u matrices met initiële waarden vult.
Procedure: Een matrix sorteren in Visual Basic Laat zien hoe u de elementen van een matrix alfabetisch sorteert.
Procedure: Een 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