Matriser i Visual Basic
En matris är en uppsättning värden, som kallas element, som är logiskt relaterade till varandra. En matris kan till exempel bestå av antalet elever i varje årskurs i en läroverk; varje element i matrisen är antalet elever i ett enda betyg. På samma sätt kan en matris bestå av en elevs betyg för en klass. varje element i matrisen är ett enskilt betyg.
Det är möjligt att använda enskilda variabler för att lagra var och en av våra dataobjekt. Om vårt program till exempel analyserar elevbetyg kan vi använda en separat variabel för varje elevs betyg, till englishGrade1
exempel , englishGrade2
osv. Den här metoden har tre huvudsakliga begränsningar:
- Vi måste veta exakt hur många betyg vi måste hantera vid designtillfället.
- Att hantera ett stort antal betyg blir snabbt otymplig. Detta gör i sin tur ett program mycket mer sannolikt att ha allvarliga buggar.
- Det är svårt att underhålla. Varje nytt betyg som vi lägger till kräver att programmet ändras, omkompileras och distribueras om.
Med hjälp av en matris kan du referera till dessa relaterade värden med samma namn och använda ett tal som kallas index eller nedsänkt för att identifiera ett enskilt element baserat på dess position i matrisen. Indexen för en matris sträcker sig från 0 till ett mindre än det totala antalet element i matrisen. När du använder Visual Basic syntax för att definiera storleken på en matris anger du dess högsta index, inte det totala antalet element i matrisen. Du kan arbeta med matrisen som en enhet, och möjligheten att iterera dess element gör att du inte behöver veta exakt hur många element den innehåller vid designtillfället.
Några snabbexempel före förklaring:
' 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)() {}
Matriselement i en enkel matris
Nu ska vi skapa en matris med namnet students
för att lagra antalet elever i varje betyg i en läroverk. Indexen för elementen sträcker sig från 0 till 6. Det är enklare att använda den här matrisen än att deklarera sju variabler.
Följande bild visar matrisen students
. För varje element i matrisen:
Indexet för elementet representerar betyget (index 0 representerar dagis).
Värdet som finns i elementet representerar antalet elever i det betyget.
Följande exempel innehåller Visual Basic kod som skapar och använder matrisen:
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
Exemplet gör tre saker:
- Den deklarerar en
students
matris med sju element. Talet6
i matrisdeklarationen anger det sista indexet i matrisen. Det är ett mindre än antalet element i matrisen. - Den tilldelar värden till varje element i matrisen. Matriselement nås med hjälp av matrisnamnet och inklusive indexet för det enskilda elementet inom parenteser.
- Den visar varje värde för matrisen. I exemplet används en
For
-instruktion för att komma åt varje element i matrisen med dess indexnummer.
Matrisen students
i föregående exempel är en endimensionell matris eftersom den använder ett index. En matris som använder mer än ett index eller ett nedsänkt objekt kallas flerdimensionell. Mer information finns i resten av den här artikeln och Matrisdimensioner i Visual Basic.
Skapa en matris
Du kan definiera storleken på en matris på flera sätt:
Du kan ange storleken när matrisen deklareras:
' 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
Du kan använda en
New
sats för att ange storleken på en matris när den skapas:' 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)() {}
Om du har en befintlig matris kan du omdefiniera dess storlek med hjälp av -instruktionen ReDim
. Du kan ange att instruktionen ReDim
ska behålla de värden som finns i matrisen, eller ange att den ska skapa en tom matris. I följande exempel visas olika användningsområden för -instruktionen ReDim
för att ändra storleken på en befintlig matris.
' 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)
Mer information finns i ReDim-instruktionen.
Lagra värden i en matris
Du kan komma åt varje plats i en matris med hjälp av ett index av typen Integer
. Du kan lagra och hämta värden i en matris genom att referera till varje matrisplats med hjälp av dess index omgivet av parenteser. Index för flerdimensionella matriser avgränsas med kommatecken (,). Du behöver ett index för varje matrisdimension.
I följande exempel visas några instruktioner som lagrar och hämtar värden i matriser.
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
Fylla i en matris med matrisliteraler
Med hjälp av en matrisliteral kan du fylla i en matris med en inledande uppsättning värden samtidigt som du skapar den. En matrisliteral består av en lista med kommaavgränsade värden som omges av klammerparenteser ({}
).
När du skapar en matris med hjälp av en matrisliteral kan du antingen ange matristypen eller använda typinferens för att fastställa matristypen. I följande exempel visas båda alternativen.
' 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 }
När du använder typinferens bestäms typen av matris av den dominerande typen i listan över literalvärden. Den dominerande typen är den typ som alla andra typer i matrisen kan utökas till. Om den här unika typen inte kan fastställas är den dominerande typen den unika typ som alla andra typer i matrisen kan begränsas till. Om ingen av dessa unika typer kan fastställas är Object
den dominerande typen . Om till exempel listan med värden som anges till matrisliteralen innehåller värden av typen Integer
, Long
och Double
, är den resulterande matrisen av typen Double
. Eftersom Integer
och Long
endast utvidgas till Double
, Double
är den dominerande typen. Mer information finns i Widening and Narrowing Conversions (Bredda och begränsa konverteringar).
Anteckning
Du kan bara använda typinferens för matriser som definieras som lokala variabler i en typmedlem. Om en explicit typdefinition saknas är matriser som definierats med matrisliteraler på klassnivå av typen Object[]
. Mer information finns i Slutsatsdragning av lokal typ.
Observera att föregående exempel definierar values
som en matris av typen Double
även om alla matrisliteraler är av typen Integer
. Du kan skapa den här matrisen eftersom värdena i matrisliteralen kan utvidgas till Double
värden.
Du kan också skapa och fylla i en flerdimensionell matris med hjälp av kapslade matrisliteraler. Kapslade matrisliteraler måste ha ett antal dimensioner som överensstämmer med den resulterande matrisen. I följande exempel skapas en tvådimensionell matris med heltal med hjälp av kapslade matrisliteraler.
' 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}}
När du använder kapslade matrisliteraler för att skapa och fylla i en matris uppstår ett fel om antalet element i den kapslade matrisliteralen inte matchar. Ett fel uppstår också om du uttryckligen deklarerar att matrisvariabeln har ett annat antal dimensioner än matrisliteralerna.
Precis som för endimensionella matriser kan du förlita dig på typinferens när du skapar en flerdimensionell matris med kapslade matrisliteraler. Den härledda typen är den dominerande typen för alla värden i alla matrisliteraler för alla kapslingsnivå. I följande exempel skapas en tvådimensionell matris av typen Double[,]
från värden som är av typen Integer
och Double
.
Dim arr = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}
Fler exempel finns i Så här initierar du en matrisvariabel i Visual Basic.
Iterera genom en matris
När du itererar genom en matris kommer du åt varje element i matrisen från det lägsta indexet till det högsta eller från det högsta till det lägsta. Använd vanligtvis antingen för... Nästa instruktion eller för varje... Nästa instruktion för att iterera genom elementen i en matris. När du inte känner till matrisens övre gränser kan du anropa Array.GetUpperBound metoden för att få det högsta värdet för indexet. Även om det lägsta indexvärdet nästan alltid är 0 kan du anropa Array.GetLowerBound metoden för att få det lägsta värdet för indexet.
I följande exempel itereras via en endimensionell matris med hjälp av -instruktionen For...Next
.
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
I följande exempel itereras via en flerdimensionell matris med hjälp av en For...Next
-instruktion. Metoden GetUpperBound har en parameter som anger dimensionen. GetUpperBound(0)
returnerar det högsta indexet för den första dimensionen och GetUpperBound(1)
returnerar det högsta indexet för den andra dimensionen.
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
I följande exempel används för varje... Nästa instruktion för att iterera genom en endimensionell matris och en tvådimensionell matris.
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
Matrisstorlek
Storleken på en matris är produkten av längden på alla dess dimensioner. Den representerar det totala antalet element som för närvarande finns i matrisen. I följande exempel deklareras till exempel en 2-dimensionell matris med fyra element i varje dimension. Som utdata från exemplet visar är matrisens storlek 16 (eller (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
Anteckning
Den här diskussionen om matrisstorlek gäller inte för ojämna matriser. Information om ojämna matriser och hur du fastställer storleken på en ojämn matris finns i avsnittet Jagged arrays (Jagged-matriser ).
Du hittar storleken på en matris med hjälp Array.Length av egenskapen . Du hittar längden på varje dimension i en flerdimensionell matris med hjälp Array.GetLength av metoden .
Du kan ändra storlek på en matrisvariabel genom att tilldela ett nytt matrisobjekt till den eller med instruktionsuttryck.ReDim
I följande exempel används -instruktionen ReDim
för att ändra en matris med 100 element till en matris med 51 element.
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
Det finns flera saker att tänka på när du hanterar storleken på en matris.
Kommentarer | |
---|---|
Måttlängd | Indexet för varje dimension är 0-baserat, vilket innebär att det sträcker sig från 0 till dess övre gräns. Därför är längden på en viss dimension en större än dimensionens deklarerade övre gräns. |
Längdgränser | Längden på varje dimension i en matris är begränsad till det maximala värdet för Integer datatypen, vilket är Int32.MaxValue eller (2 ^ 31) – 1. Men den totala storleken på en matris begränsas också av det tillgängliga minnet i systemet. Om du försöker initiera en matris som överskrider mängden tillgängligt minne genererar körningen en OutOfMemoryException. |
Storlek och elementstorlek | En matriss storlek är oberoende av datatypen för dess element. Storleken representerar alltid det totala antalet element, inte antalet byte som de förbrukar i minnet. |
Minnesförbrukning | Det är inte säkert att göra några antaganden om hur en matris lagras i minnet. Storage varierar på plattformar med olika databredder, så samma matris kan förbruka mer minne i ett 64-bitarssystem än på ett 32-bitarssystem. Beroende på systemkonfigurationen när du initierar en matris kan CLR (Common Language Runtime) tilldela lagring antingen för att packa element så nära varandra som möjligt eller justera dem alla efter naturliga maskinvarugränser. Dessutom kräver en matris en lagringskostnad för dess kontrollinformation, och den här kostnaden ökar med varje tillagd dimension. |
Matristypen
Varje matris har en datatyp som skiljer sig från datatypen för dess element. Det finns ingen enskild datatyp för alla matriser. I stället bestäms datatypen för en matris av antalet dimensioner, eller rangordningen, för matrisen och datatypen för elementen i matrisen. Två matrisvariabler har samma datatyp endast när de har samma rangordning och deras element har samma datatyp. Längden på dimensionerna för en matris påverkar inte matrisdatatypen.
Varje matris ärver från System.Array klassen och du kan deklarera en variabel som av typen Array
, men du kan inte skapa en matris av typen Array
. Även om följande kod till exempel deklarerar variabeln arr
som av typen Array
och anropar Array.CreateInstance metoden för att instansiera matrisen, visar sig matrisens typ vara Object[].
Module Example
Public Sub Main()
Dim arr As Array = Array.CreateInstance(GetType(Object), 19)
Console.WriteLine(arr.Length)
Console.WriteLine(arr.GetType().Name)
End Sub
End Module
' The example displays the following output:
' 19
' Object[]
ReDim-instruktionen kan inte heller användas på en variabel som deklarerats som typ Array
. Av dessa skäl, och av typen säkerhet, är det lämpligt att deklarera varje matris som en specifik typ.
Du kan ta reda på datatypen för antingen en matris eller dess element på flera sätt.
- Du kan anropa GetType metoden för variabeln för att hämta ett Type objekt som representerar körningstypen för variabeln. Objektet Type innehåller omfattande information i dess egenskaper och metoder.
- Du kan skicka variabeln TypeName till funktionen för att hämta en
String
med namnet på körningstypen.
I följande exempel anropas både GetType
-metoden och TypeName
funktionen för att fastställa typen av en matris. Matristypen är Byte(,)
. Observera att egenskapen Type.BaseType också anger att bastypen för bytematrisen Array är klassen .
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(,)
Matriser som returvärden och parametrar
Om du vill returnera en matris från en Function
procedur anger du matrisdatatypen och antalet dimensioner som returtyp för funktionsinstrukturen. I funktionen deklarerar du en lokal matrisvariabel med samma datatyp och antal dimensioner. I returinstrukturen inkluderar du den lokala matrisvariabeln utan parenteser.
Om du vill ange en matris som en parameter till en eller Function
-Sub
procedur definierar du parametern som en matris med en angiven datatyp och antal dimensioner. I anropet till proceduren skickar du en matrisvariabel med samma datatyp och antal dimensioner.
I följande exempel GetNumbers
returnerar funktionen en Integer()
, en endimensionell matris av typen Integer
. Proceduren ShowNumbers
accepterar ett 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
I följande exempel GetNumbersMultiDim
returnerar funktionen en Integer(,)
, en tvådimensionell matris av typen Integer
. Proceduren ShowNumbersMultiDim
accepterar ett 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
Ojämna matriser
Ibland är datastrukturen i ditt program tvådimensionell men inte rektangulär. Du kan till exempel använda en matris för att lagra data om den höga temperaturen för varje dag i månaden. Matrisens första dimension representerar månaden, men den andra dimensionen representerar antalet dagar och antalet dagar i en månad är inte enhetligt. En ojämn matris, som även kallas en matris med matriser, är utformad för sådana scenarier. En ojämn matris är en matris vars element också är matriser. En ojämn matris och varje element i en ojämn matris kan ha en eller flera dimensioner.
I följande exempel används en matris med månader, vars element är en matris med dagar. I exemplet används en ojämn matris eftersom olika månader har olika antal dagar. Exemplet visar hur du skapar en ojämn matris, tilldelar värden till den och hämtar och visar dess värden.
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
I föregående exempel tilldelas värden till den ojämna matrisen baserat på element för element med hjälp av en For...Next
loop. Du kan också tilldela värden till elementen i en ojämn matris med hjälp av kapslade matrisliteraler. Men försöket att använda kapslade matrisliteraler (till exempel Dim valuesjagged = {{1, 2}, {2, 3, 4}}
) genererar kompilatorfel BC30568. Korrigera felet genom att omsluta de inre matrisliteralerna inom parenteser. Parenteserna tvingar matrisliteraluttrycket att utvärderas och de resulterande värdena används med den yttre matrisliteralen, vilket visas i följande exempel.
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
En ojämn matris är en endimensionell matris vars element innehåller matriser. Array.Length Därför returnerar egenskapen och Array.GetLength(0)
metoden antalet element i den endimensionella matrisen och Array.GetLength(1)
genererar en IndexOutOfRangeException eftersom en ojämn matris inte är flerdimensionell. Du fastställer antalet element i varje undermatris genom att hämta värdet för varje underarrays Array.Length egenskap. I följande exempel visas hur du fastställer antalet element i en ojämn matris.
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
Matriser med noll längd
Visual Basic skiljer mellan en ennitialiserad matris (en matris vars värde är Nothing
) och en matris med noll längd eller en tom matris (en matris som inte har några element.) En ennitialiserad matris är en matris som inte har dimensionerats eller som har tilldelats några värden. Ett exempel:
Dim arr() As String
En matris med noll längd deklareras med dimensionen -1. Ett exempel:
Dim arrZ(-1) As String
Du kan behöva skapa en matris med noll längd under följande omständigheter:
Utan att riskera ett NullReferenceException undantag måste koden komma åt medlemmar i Array klassen, till exempel Length eller Rank, eller anropa en Visual Basic-funktion som UBound.
Du vill hålla koden enkel genom att inte behöva söka efter
Nothing
som ett specialfall.Koden interagerar med ett API (Application Programming Interface) som antingen kräver att du skickar en matris med noll längd till en eller flera procedurer eller returnerar en matris med noll längd från en eller flera procedurer.
Dela upp en matris
I vissa fall kan du behöva dela upp en enskild matris i flera matriser. Detta innebär att identifiera punkten eller punkterna där matrisen ska delas och sedan spotta matrisen i två eller flera separata matriser.
Anteckning
I det här avsnittet diskuteras inte uppdelningen av en enskild sträng i en strängmatris baserat på vissa avgränsare. Information om hur du delar upp en sträng finns i String.Split metoden .
De vanligaste kriterierna för att dela upp en matris är:
Antalet element i matrisen. Du kanske till exempel vill dela upp en matris med fler än ett angivet antal element i ett antal ungefär lika många delar. För det här ändamålet kan du använda värdet som returneras av antingen Array.Length metoden eller Array.GetLength .
Värdet för ett element, som fungerar som en avgränsare som anger var matrisen ska delas. Du kan söka efter ett visst värde genom att Array.FindIndex anropa metoderna och Array.FindLastIndex .
När du har fastställt indexet eller indexen där matrisen ska delas kan du skapa enskilda matriser genom att anropa Array.Copy metoden.
I följande exempel delas en matris upp i två matriser med ungefär samma storlek. (Om det totala antalet matriselement är udda har den första matrisen ett fler element än det andra.)
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
I följande exempel delas en strängmatris upp i två matriser baserat på förekomsten av ett element vars värde är "zzz", som fungerar som matrisens avgränsare. De nya matriserna innehåller inte elementet som innehåller avgränsare.
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
Sammankoppla matriser
Du kan också kombinera ett antal matriser till en enda större matris. För att göra detta använder Array.Copy du även -metoden.
Anteckning
I det här avsnittet beskrivs inte hur du ansluter en strängmatris till en enda sträng. Information om hur du ansluter till en strängmatris finns i String.Join metoden .
Innan du kopierar elementen i varje matris till den nya matrisen måste du först kontrollera att du har initierat matrisen så att den är tillräckligt stor för att rymma den nya matrisen. Det kan du göra på ett av följande två vis:
- Använd -instruktionen
ReDim Preserve
för att dynamiskt expandera matrisen innan du lägger till nya element i den. Det här är den enklaste tekniken, men det kan resultera i prestandaförsämring och överdriven minnesförbrukning när du kopierar stora matriser. - Beräkna det totala antalet element som behövs för den nya stora matrisen och lägg sedan till elementen i varje källmatris i den.
I följande exempel används den andra metoden för att lägga till fyra matriser med tio element vardera till en enda matris.
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.
Eftersom källmatriserna i det här fallet är små kan vi också dynamiskt expandera matrisen när vi lägger till elementen i varje ny matris till den. Följande exempel gör det.
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.
Samlingar som ett alternativ till matriser
Matriser är mest användbara för att skapa och arbeta med ett fast antal starkt typifierade objekt. Samlingar är ett mer flexibelt sätt att arbeta med grupper av objekt. Till skillnad från matriser, som kräver att du uttryckligen ändrar storleken på en matris med instruktionenReDim
, växer och krymper samlingarna dynamiskt när behoven för ett program ändras.
När du använder ReDim
för att omdimensionella en matris skapar Visual Basic en ny matris och släpper den föregående. Detta tar körningstid. Om antalet objekt som du arbetar med ändras ofta, eller om du inte kan förutsäga det maximala antalet objekt som du behöver, får du vanligtvis bättre prestanda med hjälp av en samling.
För vissa samlingar kan du tilldela en nyckel till alla objekt som du placerar i samlingen så att du snabbt kan hämta objektet med hjälp av nyckeln.
Om din samling bara innehåller element av en datatyp kan du använda en av klasserna i System.Collections.Generic namnområdet. En generisk samling tillämpar typsäkerhet så att ingen annan datatyp kan läggas till i den.
Mer information om samlingar finns i Samlingar.
Relaterade ämnen
Period | Definition |
---|---|
Matrisdimensioner i Visual Basic | Förklarar rangordning och dimensioner i matriser. |
Anvisningar: Initiera en matrisvariabel i Visual Basic | Beskriver hur du fyller i matriser med inledande värden. |
Anvisningar: Sortera en matris i Visual Basic | Visar hur du sorterar elementen i en matris alfabetiskt. |
Anvisningar: Tilldela en matris till en annan matris | Beskriver regler och steg för att tilldela en matris till en annan matrisvariabel. |
Felsöka matriser | Beskriver några vanliga problem som uppstår när du arbetar med matriser. |