Freigeben über


Arrays in Visual Basic

Ein Array ist eine Gruppe von Werten, die als Begriffselemente bezeichnet werden, die logisch miteinander verknüpft sind. Beispielsweise kann ein Array aus der Anzahl der Schüler in jeder Klasse in einer Grammatikschule bestehen; Jedes Element des Arrays ist die Anzahl der Kursteilnehmer in einer einzigen Klasse. Ebenso kann ein Array aus den Noten eines Schülers für einen Kurs bestehen; Jedes Element des Arrays ist eine einzelne Klasse.

Es ist möglich, einzelne Variablen zum Speichern der einzelnen Datenelemente zu verwenden. Wenn unsere Anwendung z. B. die Noten der Schüler analysiert, können wir eine separate Variable für die Noten der einzelnen Schüler verwenden, wie englishGrade1, englishGrade2, usw. Dieser Ansatz hat drei wesentliche Einschränkungen:

  • Wir müssen im Entwurfsstadium genau wissen, wie viele Klassenstufen wir verarbeiten müssen.
  • Die Verarbeitung vieler Noten wird schnell unhandlich. Dies wiederum macht eine Anwendung viel wahrscheinlicher, dass schwerwiegende Fehler auftreten.
  • Es ist schwierig aufrechtzuerhalten. Jede neue Klasse, die hinzugefügt wird, erfordert, dass die Anwendung geändert, neu kompiliert und erneut bereitgestellt wird.

Mithilfe eines Arrays können Sie auf diese verwandten Werte unter demselben Namen referenzieren und eine Zahl verwenden, die als Index oder Subskript bezeichnet wird, um ein einzelnes Element basierend auf seiner Position im Array zu identifizieren. Die Indizes eines Arrays reichen von 0 bis eins kleiner als die Gesamtanzahl der Elemente im Array. Wenn Sie visual Basic-Syntax zum Definieren der Größe eines Arrays verwenden, geben Sie den höchsten Index und nicht die Gesamtanzahl der Elemente im Array an. Sie können mit dem Array als Einheit arbeiten, und dank der Möglichkeit, seine Elemente zu iterieren, müssen Sie zur Entwurfszeit nicht genau wissen, wie viele es enthält.

Einige kurze Beispiele vor der Erläuterung:

' 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)() {}

Arrayelemente in einem einfachen Array

Erstellen wir ein Array mit dem Namen students zum Speichern der Anzahl der Kursteilnehmer in jeder Klasse in einer Grammatikschule. Die Indizes der Elemente reichen von 0 bis 6. Die Verwendung dieses Arrays ist einfacher als das Deklarieren von sieben Variablen.

Die folgende Abbildung zeigt das students Array. Für jedes Element des Arrays:

  • Der Index des Elements stellt die Noten dar (Index 0 stellt den Kindergarten dar).

  • Der Wert, der im Element enthalten ist, stellt die Anzahl der Kursteilnehmer in dieser Klasse dar.

Diagramm mit einem Array der Anzahl der Kursteilnehmer

Das folgende Beispiel enthält den Visual Basic-Code, der das Array erstellt und verwendet:


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

Im Beispiel werden drei Dinge ausgeführt:

  • Es deklariert ein students Array mit sieben Elementen. Die Zahl 6 in der Arraydeklaration gibt den letzten Index im Array an; sie ist ein Wert kleiner als die Anzahl der Elemente im Array.
  • Es weist jedem Element im Array Werte zu. Auf Arrayelemente wird mithilfe des Arraynamens zugegriffen und der Index des einzelnen Elements ist in Klammern eingeschlossen.
  • Er listet jeden Wert des Arrays auf. Im Beispiel wird eine For Anweisung verwendet, um auf jedes Element des Arrays anhand der Indexnummer zuzugreifen.

Das students Array im vorherigen Beispiel ist ein eindimensionales Array, da es einen Index verwendet. Ein Array, das mehr als einen Index oder Unterskript verwendet, wird als multidimensional bezeichnet. Weitere Informationen finden Sie im restlichen Artikel und array dimensions in Visual Basic.

Erstellen eines Arrays

Sie können die Größe eines Arrays auf verschiedene Arten definieren:

  • Sie können die Größe angeben, wenn das Array deklariert wird:

    ' 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
    
  • Sie können eine New Klausel verwenden, um die Größe eines Arrays beim Erstellen zu liefern:

    ' 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)() {}
    

Wenn Sie über ein vorhandenes Array verfügen, können Sie die Größe mithilfe der ReDim Anweisung neu definieren. Sie können angeben, dass die ReDim Anweisung die Werte im Array behält, oder Sie können angeben, dass sie ein leeres Array erstellt. Das folgende Beispiel zeigt verschiedene Verwendungsmöglichkeiten der ReDim Anweisung zum Ändern der Größe eines vorhandenen Arrays.

' 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)

Weitere Informationen finden Sie unter ReDim-Anweisung.

Speichern von Werten in einem Array

Sie können auf jede Position in einem Array zugreifen, indem Sie einen Index vom Typ verwenden Integer. Sie können Werte in einem Array speichern und abrufen, indem Sie auf die einzelnen Arrayspeicherorte verweisen, indem Sie den in Klammern eingeschlossenen Index verwenden. Indizes für mehrdimensionale Arrays werden durch Kommas (,) getrennt. Sie benötigen einen Index für jede Arraydimension.

Das folgende Beispiel zeigt einige Anweisungen, die Werte in Arrays speichern und abrufen.


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

Auffüllen eines Arrays mit Arrayliteralen

Mithilfe eines Arrayliterals können Sie ein Array mit einem anfänglichen Satz von Werten auffüllen, während Sie es erstellen. Ein Arrayliteral besteht aus einer Liste von durch Trennzeichen getrennten Werten, die in geschweifte Klammern ({}) eingeschlossen sind.

Wenn Sie ein Array mithilfe eines Arrayliterals erstellen, können Sie entweder den Arraytyp angeben oder einen Typbezug verwenden, um den Arraytyp zu bestimmen. Das folgende Beispiel zeigt beide Optionen.

' 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 }

Wenn Sie Typferenz verwenden, wird der Typ des Arrays durch den dominanten Typ in der Liste der Literalwerte bestimmt. Der dominante Typ ist der Typ, auf den alle anderen Typen im Array erweitert werden können. Wenn dieser eindeutige Typ nicht bestimmt werden kann, ist der dominante Typ der eindeutige Typ, auf den sich alle anderen Typen im Array einschränken können. Wenn keine dieser eindeutigen Typen bestimmt werden kann, lautet Objectder dominante Typ . Wenn z. B. die Liste der Werte, die im Arrayliteral enthalten sind, Werte vom Typ Integer, Long, und Double enthält, ist das resultierende Array vom Typ Double. Da Integer und Long sich nur auf Double weiten, ist Double der dominante Typ. Weitere Informationen finden Sie unter Widening and Narrowing Conversions.

Hinweis

Sie können typinferenz nur für Arrays verwenden, die als lokale Variablen in einem Typelement definiert sind. Wenn eine explizite Typdefinition nicht vorhanden ist, sind Arrays, die mit Arrayliteralen auf Klassenebene definiert sind, vom Typ Object[]. Weitere Informationen finden Sie unter Lokale Typinferenz.

Beachten Sie, dass das vorherige Beispiel values als ein Array vom Typ Double definiert, obwohl alle Arrayliterale vom Typ Integer sind. Sie können dieses Array erstellen, da die Werte im Arrayliteral auf Double Werte erweitert werden können.

Sie können auch ein mehrdimensionales Array erstellen und auffüllen, indem Sie geschachtelte Arrayliterale verwenden. Geschachtelte Arrayliterale müssen über eine Anzahl von Dimensionen verfügen, der mit dem erhaltenen Array konsistent ist. Im folgenden Beispiel wird ein zweidimensionales Array mit ganzzahligen Zahlen mithilfe geschachtelter Arrayliterale erstellt.

' 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}}

Wenn Sie geschachtelte Array-Literale zum Erstellen und Auffüllen eines Arrays verwenden, tritt ein Fehler auf, wenn die Anzahl der Elemente in den geschachtelten Array-Literalen nicht übereinstimmt. Ein Fehler tritt auch auf, wenn Sie die Arrayvariable explizit mit einer anderen Anzahl von Dimensionen als die der Array-Literale deklarieren.

Genau wie bei eindimensionalen Arrays können Sie sich beim Erstellen eines mehrdimensionalen Arrays auf Typinferenz mit geschachtelten Arrayliteralen verlassen. Der abgeleitete Typ ist der bestimmende Typ für sämtliche Werte in allen Arrayliteralen für alle Schachtelungsebenen. Im folgenden Beispiel wird ein zweidimensionales Array vom Typ Double[,] aus Werten erstellt, die vom Typ Integer und Double sind.

Dim arr = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}

Weitere Beispiele finden Sie unter How to: Initialize an Array Variable in Visual Basic.

Durchlaufen eines Arrays

Wenn Sie ein Array durchlaufen, greifen Sie auf jedes Element im Array von dem niedrigsten Index zum höchsten oder vom höchsten zum niedrigsten Element zu. Verwenden Sie in der Regel entweder die For...Next-Anweisung oder die For Each...Next-Anweisung, um die Elemente eines Arrays zu durchlaufen. Wenn Sie die oberen Grenzen des Arrays nicht kennen, können Sie die Array.GetUpperBound Methode aufrufen, um den höchsten Wert des Indexes abzurufen. Obwohl der niedrigste Indexwert fast immer 0 ist, können Sie die Array.GetLowerBound Methode aufrufen, um den niedrigsten Wert des Indexes abzurufen.

Das folgende Beispiel iteriert durch ein eindimensionales Array, indem die For...Next Anweisung verwendet wird.


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

Im folgenden Beispiel wird ein mehrdimensionales Array mit einer For...Next -Anweisung durchlaufen. Die GetUpperBound Methode verfügt über einen Parameter, der die Dimension angibt. GetUpperBound(0) gibt den höchsten Index der ersten Dimension zurück und GetUpperBound(1) gibt den höchsten Index der zweiten Dimension zurück.


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

Im folgenden Beispiel wird eine For Each...Next-Anweisung verwendet, um durch ein eindimensionales Array und ein zweidimensionales Array zu iterieren.


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

Arraygröße

Die Größe eines Arrays ist das Produkt der Längen aller Dimensionen. Sie stellt die Gesamtanzahl der Elemente dar, die derzeit im Array enthalten sind. Im folgenden Beispiel wird beispielsweise ein zweidimensionales Array mit vier Elementen in jeder Dimension deklariert. Wie die Ausgabe des Beispiels zeigt, beträgt die Größe des Arrays 16 (oder (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

Hinweis

Diese Erläuterung der Arraygröße gilt nicht für Jagged Arrays. Informationen zu markierten Arrays und zur Bestimmung der Größe eines markierten Arrays finden Sie im Abschnitt "Jagged arrays ".

Sie können die Größe eines Arrays mithilfe der Array.Length Eigenschaft ermitteln. Sie können die Länge jeder Dimension eines mehrdimensionalen Arrays mithilfe der Array.GetLength Methode ermitteln.

Sie können die Größe einer Array-Variable ändern, indem Sie ihr ein neues Array-Objekt zuweisen oder die ReDim-Anweisung verwenden. Im folgenden Beispiel wird die ReDim Anweisung verwendet, um ein 100-Elementarray in ein 51-Elementarray zu ändern.


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

 

Es gibt mehrere Punkte, die Sie beim Umgang mit der Größe eines Arrays berücksichtigen sollten.

Hinweise
Bemaßungslänge Der Index jeder Dimension ist 0-basiert, was bedeutet, dass er zwischen 0 und seiner oberen Grenze liegt. Daher ist die Länge einer bestimmten Dimension eine größer als die deklarierte Obergrenze dieser Dimension.
Längenbeschränkungen Die Länge jeder Dimension eines Arrays ist auf den Maximalwert des Integer-Datentyps begrenzt, der Int32.MaxValue bzw. (2 ^ 31) - 1 ist. Die Gesamtgröße eines Arrays ist jedoch auch durch den auf Ihrem System verfügbaren Arbeitsspeicher begrenzt. Wenn Sie versuchen, ein Array zu initialisieren, das den verfügbaren Arbeitsspeicher überschreitet, löst die Laufzeit ein OutOfMemoryException.
Größe und Elementgröße Die Größe eines Arrays ist unabhängig vom Datentyp seiner Elemente. Die Größe stellt immer die Gesamtanzahl der Elemente dar, nicht die Anzahl der Bytes, die sie im Arbeitsspeicher verbrauchen.
Arbeitsspeichernutzung Es ist nicht sicher, annahmen zu machen, wie ein Array im Speicher gespeichert wird. Der Speicher variiert auf Plattformen unterschiedlicher Datenbreiten, sodass dasselbe Array mehr Arbeitsspeicher auf einem 64-Bit-System verbrauchen kann als auf einem 32-Bit-System. Abhängig von der Systemkonfiguration beim Initialisieren eines Arrays kann die Common Language Runtime (CLR) den Speicher entweder nutzen, um die Elemente so nah wie möglich zusammenzupacken oder um sie alle auf natürliche Hardware-Grenzen auszurichten. Außerdem erfordert ein Array einen Speicheraufwand für seine Steuerungsinformationen, und dieser Aufwand erhöht sich mit jeder hinzugefügten Dimension.

Der Arraytyp

Jedes Array verfügt über einen Datentyp, der sich vom Datentyp seiner Elemente unterscheidet. Es gibt keinen einzelnen Datentyp für alle Arrays. Stattdessen wird der Datentyp eines Arrays durch die Anzahl der Dimensionen oder Rangangaben des Arrays und den Datentyp der Elemente im Array bestimmt. Zwei Arrayvariablen weisen nur dann denselben Datentyp auf, wenn sie denselben Rang haben und ihre Elemente denselben Datentyp aufweisen. Die Längen der Dimensionen eines Arrays wirken sich nicht auf den Arraydatentyp aus.

Jedes Array erbt von der System.Array Klasse, und Sie können eine Variable als Typ Arraydeklarieren, aber Sie können kein Array vom Typ Arrayerstellen. Obwohl der folgende Code die arr Variable als Typ Array deklariert und die Array.CreateInstance Methode zum Instanziieren des Arrays aufruft, wird der Arraytyp als Object[] nachgewiesen.


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[]

Außerdem kann die ReDim-Anweisung nicht für eine Variable verwendet werden, die als Typ Arraydeklariert ist. Aus diesen Gründen und aus Gründen der Typsicherheit ist es ratsam, jedes Array als einen bestimmten Typ zu deklarieren.

Sie können den Datentyp eines Arrays oder seiner Elemente auf verschiedene Weise ermitteln.

  • Sie können die GetType Methode für die Variable aufrufen, um ein Type Objekt abzurufen, das den Laufzeittyp der Variablen darstellt. Das Type Objekt enthält umfangreiche Informationen in seinen Eigenschaften und Methoden.
  • Sie können die Variable an die TypeName Funktion übergeben, um einen String mit dem Namen des Laufzeittyps abzurufen.

Im folgenden Beispiel werden sowohl die GetType Methode als auch die TypeName Funktion aufgerufen, um den Typ eines Arrays zu bestimmen. Der Arraytyp ist Byte(,). Beachten Sie, dass die Type.BaseType Eigenschaft auch angibt, dass der Basistyp des Bytearrays die Array Klasse ist.


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(,)


Die Arrays als Rückgabewerte und Parameter

Um ein Array aus einer Function Prozedur zurückzugeben, geben Sie den Arraydatentyp und die Anzahl der Dimensionen als Rückgabetyp der Function-Anweisung an. Deklarieren Sie innerhalb der Funktion eine lokale Arrayvariable mit demselben Datentyp und derselben Anzahl dimensionen. Schließen Sie in der Return-Anweisung die lokale Arrayvariable ohne Klammern ein.

Um ein Array als Parameter für eine Sub oder Function Prozedur anzugeben, definieren Sie den Parameter als Array mit einem angegebenen Datentyp und der Anzahl der Dimensionen. Übergeben Sie im Aufruf der Prozedur eine Arrayvariable mit demselben Datentyp und derselben Anzahl dimensionen.

Im folgenden Beispiel gibt die GetNumbers Funktion ein Integer()eindimensionales Array vom Typ zurück Integer. Die ShowNumbers Prozedur akzeptiert ein 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
    

Im folgenden Beispiel gibt die GetNumbersMultiDim Funktion ein Integer(,)zweidimensionales Array vom Typ zurück Integer. Die ShowNumbersMultiDim Prozedur akzeptiert ein 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

Verzweigte Arrays

Manchmal ist die Datenstruktur in Ihrer Anwendung zweidimensional, aber nicht rechteckig. Sie können z. B. ein Array verwenden, um Daten über die hohe Temperatur jedes Monats zu speichern. Die erste Dimension des Arrays stellt den Monat dar, aber die zweite Dimension stellt die Anzahl der Tage dar, und die Anzahl der Tage in einem Monat ist nicht einheitlich. Ein Jagged Array, das auch als Array von Arrays bezeichnet wird, ist für solche Szenarien konzipiert. Ein Jagged Array ist ein Array, dessen Elemente wiederum Arrays sind. Ein gezacktes Array und jedes Element in einem gezackten Array kann eine oder mehrere Dimensionen aufweisen.

Im folgenden Beispiel wird ein Array von Monaten verwendet, von denen jedes Element ein Array von Tagen ist. Im Beispiel wird ein gezacktes Array verwendet, da unterschiedliche Monate unterschiedliche Anzahl von Tagen aufweisen. Das Beispiel zeigt, wie Sie ein unregelmäßiges Array erstellen, ihm Werte zuweisen und dessen Werte abrufen und anzeigen.

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

Im vorherigen Beispiel werden dem Jagged Array mithilfe einer For...Next-Schleife Werte auf Element-für-Element-Basis zugewiesen. Sie können den Elementen eines Jagged Arrays auch Werte zuweisen, indem Sie geschachtelte Arrayliterale verwenden. Der Versuch, geschachtelte Arrayliterale (z. B. Dim valuesjagged = {{1, 2}, {2, 3, 4}}) zu verwenden, erzeugt jedoch den Compilerfehler BC30568. Um den Fehler zu beheben, schließen Sie die inneren Array-Literale in runden Klammern ein. Die Klammern erzwingen die Auswertung des Literalausdrucks des Arrays, und die erhaltenen Werte werden mit dem äußeren Arrayliteral verwendet. Dies ist im folgenden Beispiel veranschaulicht.


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

Ein Jagged Array ist ein eindimensionales Array, dessen Elemente Arrays enthalten. Daher geben die Array.Length Eigenschaft und die Array.GetLength(0) Methode die Anzahl der Elemente im eindimensionalen Array zurück, und Array.GetLength(1) löst ein IndexOutOfRangeException aus, da ein gezacktes Array nicht multidimensional ist. Sie bestimmen die Anzahl der Elemente in den einzelnen Unterarrays, indem Sie den Wert der Eigenschaft der einzelnen Unterarrays Array.Length abrufen. Im folgenden Beispiel wird veranschaulicht, wie die Anzahl von Elementen in einem Jagged Array bestimmt wird.


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

Arrays mit der Länge 0 (null)

Visual Basic unterscheidet zwischen einem nicht initialisierten Array (einem Array, dessen Wert ist Nothing) und einem array mit nuller Länge oder einem leeren Array (ein Array ohne Elemente).) Ein nicht initialisiertes Array ist eine Matrix, die nicht dimensioniert wurde oder denen keine Werte zugewiesen wurden. Beispiel:

Dim arr() As String

Ein Array der Länge Null wird mit einer Dimension von -1 deklariert. Beispiel:

Dim arrZ(-1) As String

Möglicherweise müssen Sie unter den folgenden Umständen ein Array der Länge Null erstellen:

  • Der Code muss, ohne eine NullReferenceException -Ausnahme auszulösen, auf Member der Array -Klasse zugreifen, beispielsweise auf Length oder Rank, oder eine Visual Basic-Funktion wie UBound aufrufen.

  • Sie möchten Ihren Code einfach halten, indem Sie Nothing nicht als Sonderfall überprüfen müssen.

  • Ihr Code interagiert mit einer Api (Application Programming Interface), die entweder erfordert, dass Sie ein Array der Länge Null an eine oder mehrere Prozeduren übergeben oder ein Array der Länge Null aus einer oder mehreren Prozeduren zurückgeben müssen.

Aufteilen eines Arrays

In einigen Fällen müssen Sie möglicherweise ein einzelnes Array in mehrere Arrays aufteilen. Dies umfasst die Identifizierung des Punktes oder der Punkte, an dem das Array aufgeteilt werden soll, und dann das Array in zwei oder mehr separate Arrays aufzuteilen.

Hinweis

In diesem Abschnitt wird das Aufteilen einer einzelnen Zeichenfolge in ein Zeichenfolgenarray basierend auf einem Trennzeichen nicht erläutert. Informationen zum Teilen einer Zeichenfolge finden Sie unter der String.Split Methode.

Die häufigsten Kriterien zum Aufteilen eines Arrays sind:

  • Die Anzahl der Elemente im Array. Sie können beispielsweise ein Array mit mehr als einer angegebenen Anzahl von Elementen in eine Anzahl ungefähr gleicher Teile aufteilen. Zu diesem Zweck können Sie den von der Array.Length- oder Array.GetLength-Methode zurückgegebenen Wert verwenden.

  • Der Wert eines Elements, das als Trennzeichen dient, das angibt, wo das Array aufgeteilt werden soll. Sie können nach einem bestimmten Wert suchen, indem Sie die Methoden Array.FindIndex und Array.FindLastIndex aufrufen.

Nachdem Sie den Index oder die Indizes bestimmt haben, an denen das Array aufgeteilt werden soll, können Sie dann die einzelnen Arrays erstellen, indem Sie die Array.Copy Methode aufrufen.

Im folgenden Beispiel wird ein Array in zwei Arrays mit ungefähr gleicher Größe aufgeteilt. (Wenn die Gesamtzahl der Arrayelemente ungerade ist, weist das erste Array ein mehr Element als die zweite auf.)


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

Im folgenden Beispiel wird ein Zeichenfolgenarray basierend auf dem Vorhandensein eines Elements, dessen Wert „zzz“ (das Arraytrennzeichen) ist, in zwei Arrays unterteilt. Die neuen Arrays enthalten nicht das Element, das das Trennzeichen enthält.


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

Verknüpfen von Arrays

Sie können auch eine Reihe von Arrays in einem einzigen größeren Array kombinieren. Dazu verwenden Sie auch die Array.Copy Methode.

Hinweis

In diesem Abschnitt wird das Verknüpfen eines Zeichenfolgenarrays zu einer einzelnen Zeichenfolge nicht erläutert. Informationen zum Verknüpfen eines Zeichenfolgenarrays finden Sie in der Methode String.Join.

Bevor Sie die Elemente der einzelnen Arrays in das neue Array kopieren, müssen Sie zuerst sicherstellen, dass Sie das Array initialisiert haben, damit es groß genug ist, um das neue Array aufzunehmen. Sie können dies auf eine von zwei Arten tun:

  • Verwenden Sie die ReDim Preserve Anweisung, um das Array dynamisch zu erweitern, bevor Neue Elemente hinzugefügt werden. Dies ist die einfachste Technik, kann jedoch zu Leistungsbeeinträchtigungen und übermäßigem Arbeitsspeicherverbrauch führen, wenn Sie große Arrays kopieren.
  • Berechnen Sie die Gesamtanzahl der elemente, die für das neue große Array erforderlich sind, und fügen Sie dann die Elemente jedes Quellarrays hinzu.

Im folgenden Beispiel wird der zweite Ansatz verwendet, um vier Arrays mit jeweils zehn Elementen zu einem einzelnen Array hinzuzufügen.

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.

Da die Quellarrays in diesem Fall klein sind, können wir das Array auch dynamisch erweitern, während wir die Elemente jedes neuen Arrays hinzufügen. Im folgenden Beispiel wird dies ausgeführt.

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.

Sammlungen als Alternative zu Arrays

Arrays sind am nützlichsten für das Erstellen und Arbeiten mit einer festen Anzahl stark typierter Objekte. Sammlungen bieten eine flexiblere Möglichkeit, mit Gruppen von Objekten zu arbeiten. Im Gegensatz zu Arrays, die erfordern, dass Sie die Größe eines Arrays mit der ReDim Anweisung explizit ändern, vergrößern und verkleinern Sammlungen dynamisch, wenn sich die Anforderungen einer Anwendung ändern.

Wenn Sie ReDim verwenden, um die Größe eines Arrays zu ändern, erstellt Visual Basic ein neues Array und löscht das vorherige. Dies nimmt Ausführungszeit in Anspruch. Daher, wenn die Anzahl der Elemente, mit denen Sie arbeiten, häufig wechselt, oder Sie die maximale Anzahl der benötigten Elemente nicht vorhersagen können, erhalten Sie in der Regel eine bessere Leistung, indem Sie eine Sammlung verwenden.

Bei einigen Auflistungen können Sie jedem Objekt, das Sie in die Auflistung einfügen, einen Schlüssel zuweisen, damit Sie das Objekt mithilfe des Schlüssels schnell abrufen können.

Wenn Ihre Sammlung nur Elemente eines Datentyps enthält, können Sie eine der Klassen im System.Collections.Generic Namespace verwenden. Eine generische Sammlung erzwingt die Typsicherheit, sodass kein anderer Datentyp hinzugefügt werden kann.

Weitere Informationen zu Sammlungen finden Sie unter Sammlungen.

Begriff Definition
Arrayabmessungen in Visual Basic Erläutert Rang und Dimensionen in Arrays.
Anleitung: Initialisieren einer Arrayvariablen in Visual Basic Beschreibt, wie Arrays mit Anfangswerten aufgefüllt werden.
Vorgehensweise: Sortieren eines Arrays in Visual Basic Zeigt, wie die Elemente eines Arrays alphabetisch sortiert werden.
Vorgehensweise: Zuweisen eines Arrays zu einem anderen Array Beschreibt die Regeln und Schritte zum Zuweisen eines Arrays zu einer anderen Arrayvariablen.
Problembehandlung bei Arrays Beschreibt einige häufige Probleme, die beim Arbeiten mit Arrays auftreten.

Siehe auch