Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
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 Zahl6
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 Object
der 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 Array
deklarieren, aber Sie können kein Array vom Typ Array
erstellen. 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 Array
deklariert 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.
Zugehörige Themen
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. |