Dela via


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 englishGrade1exempel , englishGrade2osv. 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.

Diagram showing an array of the numbers of students

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. Talet 6 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 Objectden dominerande typen . Om till exempel listan med värden som anges till matrisliteralen innehåller värden av typen Integer, Longoch 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 -Subprocedur 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.

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.

Se även