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
, englishGrade2
enzovoort. 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.
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 getal6
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 Object
het dominante type . Als de lijst met waarden die zijn opgegeven aan de letterlijke matrix bijvoorbeeld waarden van het type Integer
Long
bevat, en Double
de resulterende matrix van het type Double
is. 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 Array
maken. 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.
Verwante onderwerpen
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. |