Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 englishGrade1
englishGrade2
, 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.
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 getal6
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 Object
het 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 Array
te zijn, maar u kunt geen matrix van het type Array
maken. 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.
Verwante onderwerpen
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. |