Tablica jest zestawem wartości, które są terminami elementów, które są logicznie powiązane ze sobą. Na przykład tablica może składać się z liczby uczniów w każdej klasie w gimnazjum; każdy element tablicy jest liczbą uczniów w jednej klasie. Podobnie tablica może składać się z ocen ucznia dla klasy; każdy element tablicy jest jedną klasą.
Można użyć poszczególnych zmiennych do przechowywania każdego z naszych elementów danych. Jeśli na przykład nasza aplikacja analizuje oceny uczniów, możemy użyć oddzielnej zmiennej dla klasy każdego ucznia, takiej jak englishGrade1, englishGrade2itp. Takie podejście ma trzy główne ograniczenia:
Musimy wiedzieć w czasie projektowania dokładnie, ile ocen musimy sobie poradzić.
Obsługa dużej liczby ocen szybko staje się nieporętna. To z kolei sprawia, że aplikacja jest znacznie bardziej skłonna do wystąpienia poważnych usterek.
Trudno jest utrzymać. Każda nowa dodana klasa wymaga zmodyfikowania, ponownego skompilowania i ponownego wdrożenia aplikacji.
Za pomocą tablicy można odwoływać się do tych powiązanych wartości o tej samej nazwie i użyć liczby, która jest nazywana indeksem lub indeksem dolnym , aby zidentyfikować pojedynczy element na podstawie jego pozycji w tablicy. Indeksy tablicy wahają się od 0 do jednej mniejszej niż całkowita liczba elementów w tablicy. W przypadku używania składni Visual Basic do definiowania rozmiaru tablicy należy określić jej najwyższy indeks, a nie całkowitą liczbę elementów w tablicy. Możesz pracować z tablicą jako jednostką, a możliwość iterowania jej elementów pozwala znać dokładnie, ile elementów zawiera w czasie projektowania.
Kilka szybkich przykładów przed wyjaśnieniem:
VB
' Declare a single-dimension array of 5 numbers.Dim numbers(4) AsInteger' Declare a single-dimension array and set its 4 values.Dim numbers = NewInteger() {1, 2, 4, 8}
' Change the size of an existing array to 16 elements and retain the current values.ReDimPreserve 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) AsDouble' Declare a 4 x 3 multidimensional array and set array element values.Dim matrix = NewInteger(,) {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}}
' Declare a jagged arrayDim sales()() AsDouble = NewDouble(11)() {}
Elementy tablicy w prostej tablicy
Utwórzmy tablicę o nazwie students , aby przechowywać liczbę uczniów w każdej klasie w gimnazjum. Indeksy elementów wahają się od 0 do 6. Użycie tej tablicy jest prostsze niż deklarowanie siedmiu zmiennych.
Poniższa ilustracja przedstawia tablicę students . Dla każdego elementu tablicy:
Indeks elementu reprezentuje ocenę (indeks 0 reprezentuje przedszkole).
Wartość zawarta w elemencie reprezentuje liczbę uczniów w tej klasie.
Poniższy przykład zawiera kod Visual Basic, który tworzy tablicę i używa jej:
VB
Module SimpleArray
PublicSub Main()
' Declare an array with 7 elements.Dim students(6) AsInteger' 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 AsInteger = 0To6Dim grade AsString = If(ctr = 0, "kindergarten", $"grade {ctr}")
Console.WriteLine($"Students in {grade}: {students(ctr)}")
NextEndSubEndModule' 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
Przykład wykonuje trzy czynności:
Deklaruje tablicę students z siedmioma elementami. Liczba 6 w deklaracji tablicy wskazuje ostatni indeks w tablicy. Jest to jedna mniejsza niż liczba elementów w tablicy.
Przypisuje wartości do każdego elementu w tablicy. Dostęp do elementów tablicy jest uzyskiwany przy użyciu nazwy tablicy i dołączania indeksu pojedynczego elementu w nawiasach.
Wyświetla listę każdej wartości tablicy. W przykładzie użyto For instrukcji w celu uzyskania dostępu do każdego elementu tablicy według jego numeru indeksu.
Tablica students w poprzednim przykładzie jest tablicą jednowymiarową, ponieważ używa jednego indeksu. Tablica używająca więcej niż jednego indeksu lub indeksu dolnego jest nazywana wielowymiarowymi. Aby uzyskać więcej informacji, zobacz pozostałe części tego artykułu i Wymiary tablicy w Visual Basic.
Tworzenie tablicy
Rozmiar tablicy można zdefiniować na kilka sposobów:
Rozmiar można określić, gdy tablica jest zadeklarowana:
VB
' Declare an array with 10 elements.Dim cargoWeights(9) AsDouble' Declare a 24 x 2 array.Dim hourlyTemperatures(23, 1) AsInteger' Declare a jagged array with 31 elements.Dim januaryInquiries(30)() AsString
Możesz użyć New klauzuli , aby podać rozmiar tablicy podczas jej tworzenia:
VB
' Declare an array with 10 elements.Dim cargoWeights() AsDouble = NewDouble(9) {}
' Declare a 24 x 2 array.Dim hourlyTemperatures(,) AsInteger = NewInteger(23, 1) {}
' Declare a jagged array with 31 elements. Dim januaryInquiries()() AsString = NewString(30)() {}
Jeśli masz istniejącą tablicę, możesz ponownie zdefiniować jej rozmiar przy użyciu instrukcji ReDim . Można określić, że ReDim instrukcja zachowuje wartości, które znajdują się w tablicy, lub można określić, że tworzy pustą tablicę. W poniższym przykładzie pokazano różne zastosowania instrukcji ReDim w celu zmodyfikowania rozmiaru istniejącej tablicy.
VB
' Assign a new array size and retain the current values.ReDimPreserve cargoWeights(20)
' Assign a new array size and retain only the first five values.ReDimPreserve cargoWeights(4)
' Assign a new array size and discard all current element values.ReDim cargoWeights(15)
Dostęp do każdej lokalizacji w tablicy można uzyskać przy użyciu indeksu typu Integer. Wartości można przechowywać i pobierać w tablicy, odwołując się do każdej lokalizacji tablicy, używając jej indeksu ujętego w nawiasy. Indeksy dla tablic wielowymiarowych są oddzielone przecinkami (,). Potrzebujesz jednego indeksu dla każdego wymiaru tablicy.
W poniższym przykładzie pokazano niektóre instrukcje, które przechowują i pobierają wartości w tablicach.
VB
Module Example
PublicSub Main()
' Create a 10-element integer array.Dim numbers(9) AsIntegerDim value AsInteger = 2' Write values to it.For ctr AsInteger = 0To9
numbers(ctr) = value
value *= 2Next' Read and sum the array values. Dim sum AsIntegerFor ctr AsInteger = 0To9
sum += numbers(ctr)
Next
Console.WriteLine($"The sum of the values is {sum:N0}")
EndSubEndModule' The example displays the following output:' The sum of the values is 2,046
Wypełnianie tablicy literałami tablicy
Używając literału tablicy, można wypełnić tablicę początkowym zestawem wartości w tym samym czasie, który został utworzony. Literał tablicy składa się z listy wartości rozdzielanych przecinkami, które są ujęte w nawiasy klamrowe ({}).
Podczas tworzenia tablicy przy użyciu literału tablicy można podać typ tablicy lub użyć wnioskowania typu w celu określenia typu tablicy. W poniższym przykładzie przedstawiono obie opcje.
VB
' Array literals with explicit type definition.Dim numbers = NewInteger() {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() AsString = { "the", "a", "an" }
' Array literals with explicit widening type definition.Dim values() AsDouble = { 1, 2, 3, 4, 5 }
W przypadku korzystania z wnioskowania typu typ tablicy jest określany przez dominujący typ na liście wartości literałów. Dominujący typ jest typem, do którego można rozszerzyć wszystkie inne typy w tablicy. Jeśli nie można określić tego unikatowego typu, typ dominujący jest unikatowym typem, do którego wszystkie inne typy w tablicy mogą zawęzić. Jeśli żaden z tych unikatowych typów nie można określić, typ dominujący to Object. Jeśli na przykład lista wartości dostarczonych do literału tablicy zawiera wartości typu Integer, Longi Double, wynikowa tablica jest typu Double. Ponieważ Integer i Long poszerzyć tylko do Double, Double jest dominującym typem. Aby uzyskać więcej informacji, zobacz Rozszerzanie i zawężanie konwersji.
Uwaga
Wnioskowanie typu można używać tylko w przypadku tablic zdefiniowanych jako zmienne lokalne w składowej typu. Jeśli jawna definicja typu jest nieobecna, tablice zdefiniowane z literałami tablicy na poziomie klasy są typu Object[]. Aby uzyskać więcej informacji, zobacz Wnioskowanie typu lokalnego.
Należy pamiętać, że w poprzednim przykładzie zdefiniowano values jako tablicę typu Double , mimo że wszystkie literały tablicy mają typ Integer. Tę tablicę można utworzyć, ponieważ wartości w literale tablicy mogą być rozszerzane na Double wartości.
Można również utworzyć i wypełnić tablicę wielowymiarową przy użyciu zagnieżdżonych literałów tablicy. Zagnieżdżone literały tablicy muszą mieć wiele wymiarów zgodnych z wynikową tablicą. Poniższy przykład tworzy dwuwymiarową tablicę liczb całkowitych przy użyciu zagnieżdżonych literałów tablicy.
VB
' 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}}
W przypadku używania zagnieżdżonych literałów tablicy do tworzenia i wypełniania tablicy występuje błąd, jeśli liczba elementów w zagnieżdżonych literałach tablicy nie jest zgodna. Błąd występuje również, jeśli jawnie zadeklarowasz zmienną tablicową, aby mieć inną liczbę wymiarów niż literały tablicy.
Tak jak w przypadku tablic jednowymiarowych, można polegać na wnioskowaniu typu podczas tworzenia tablicy wielowymiarowej z zagnieżdżonych literałów tablicy. Wnioskowany typ jest dominującym typem dla wszystkich wartości we wszystkich literałach tablicy dla wszystkich poziomów zagnieżdżania. W poniższym przykładzie jest tworzona dwuwymiarowa tablica typu Double[,] na podstawie wartości typu Integer i Double.
Podczas iterowania tablicy uzyskujesz dostęp do każdego elementu w tablicy od najniższego indeksu do najwyższego lub od najwyższego do najniższego. Zazwyczaj należy użyć dowolnego z opcji For... Następna instrukcja lub instrukcja dla każdego... Następna instrukcja do iterowania elementów tablicy. Jeśli nie znasz górnych granic tablicy, możesz wywołać metodę Array.GetUpperBound , aby uzyskać najwyższą wartość indeksu. Chociaż najniższa wartość indeksu wynosi prawie zawsze 0, można wywołać metodę Array.GetLowerBound , aby uzyskać najniższą wartość indeksu.
Poniższy przykład iteruje tablicę jednowymiarową przy użyciu instrukcji For...Next .
VB
Module IterateArray
PublicSub Main()
Dim numbers = {10, 20, 30}
For index = 0To numbers.GetUpperBound(0)
Console.WriteLine(numbers(index))
NextEndSubEndModule' The example displays the following output:' 10' 20' 30
Poniższy przykład iteruje tablicę wielowymiarową przy użyciu instrukcji For...Next . Metoda GetUpperBound ma parametr określający wymiar. GetUpperBound(0) Zwraca najwyższy indeks pierwszego wymiaru i GetUpperBound(1) zwraca najwyższy indeks drugiego wymiaru.
VB
Module IterateArray
PublicSub Main()
Dim numbers = {{1, 2}, {3, 4}, {5, 6}}
For index0 = 0To numbers.GetUpperBound(0)
For index1 = 0To numbers.GetUpperBound(1)
Console.Write($"{numbers(index0, index1)} ")
Next
Console.WriteLine()
NextEndSubEndModule' The example displays the following output:' Output ' 1 2 ' 3 4 ' 5 6
W poniższym przykładzie użyto obiektu Dla każdego... Następna instrukcja do iterowania po jednowymiarowej tablicy i dwuwymiarowej tablicy.
VB
Module IterateWithForEach
PublicSub Main()
' Declare and iterate through a one-dimensional array.Dim numbers1 = {10, 20, 30}
ForEach number In numbers1
Console.WriteLine(number)
Next
Console.WriteLine()
Dim numbers = {{1, 2}, {3, 4}, {5, 6}}
ForEach number In numbers
Console.WriteLine(number)
NextEndSubEndModule' The example displays the following output:' 10' 20' 30'' 1' 2' 3' 4' 5' 6
Rozmiar tablicy
Rozmiar tablicy jest iloczynem długości wszystkich jego wymiarów. Reprezentuje całkowitą liczbę elementów znajdujących się obecnie w tablicy. Na przykład poniższy przykład deklaruje tablicę dwuwymiarową z czterema elementami w każdym wymiarze. Jak pokazuje dane wyjściowe z przykładu, rozmiar tablicy wynosi 16 (lub (3 + 1) * (3 + 1).
VB
Module Example
PublicSub Main()
Dim arr(3, 3) AsInteger
Console.WriteLine(arr.Length)
EndSubEndModule' The example displays the following output:' 16
Rozmiar tablicy można znaleźć przy użyciu Array.Length właściwości . Długość każdego wymiaru tablicy wielowymiarowej można znaleźć przy użyciu Array.GetLength metody .
Można zmienić rozmiar zmiennej tablicy, przypisując do niej nowy obiekt tablicy lub za pomocą instrukcji ReDim Statement . W poniższym przykładzie użyto instrukcji ReDim , aby zmienić tablicę 100 elementów na tablicę 51-elementową.
VB
Module Example
PublicSub Main()
Dim arr(99) AsInteger
Console.WriteLine(arr.Length)
Redim arr(50)
Console.WriteLine(arr.Length)
EndSubEndModule' The example displays the following output:' 100' 51
Podczas pracy z rozmiarem tablicy należy pamiętać o kilku kwestiach.
Uwagi
Długość wymiaru
Indeks każdego wymiaru jest oparty na 0, co oznacza, że waha się od 0 do górnej granicy. W związku z tym długość danego wymiaru jest większa niż zadeklarowana górna granica tego wymiaru.
Limity długości
Długość każdego wymiaru tablicy jest ograniczona do maksymalnej wartości Integer typu danych lub Int32.MaxValue (2 ^ 31) – 1. Jednak całkowity rozmiar tablicy jest również ograniczony przez pamięć dostępną w systemie. Jeśli próbujesz zainicjować tablicę, która przekracza ilość dostępnej pamięci, środowisko uruchomieniowe zgłasza błąd OutOfMemoryException.
Rozmiar i rozmiar elementu
Rozmiar tablicy jest niezależny od typu danych jego elementów. Rozmiar zawsze reprezentuje całkowitą liczbę elementów, a nie liczbę bajtów, które zużywają w pamięci.
Zużycie pamięci
Nie można bezpiecznie założyć żadnych założeń dotyczących sposobu przechowywania tablicy w pamięci. Storage różni się na platformach o różnych szerokościach danych, więc ta sama tablica może zużywać więcej pamięci w systemie 64-bitowym niż w systemie 32-bitowym. W zależności od konfiguracji systemu podczas inicjowania tablicy środowisko uruchomieniowe języka wspólnego (CLR) może przypisać magazyn do elementów pakietu tak blisko siebie, jak to możliwe, lub wyrównać je wszystkie na granicach sprzętu naturalnego. Ponadto tablica wymaga nakładu pracy magazynu na potrzeby informacji kontrolnych, a to obciążenie zwiększa się wraz z każdym dodanym wymiarem.
Typ tablicy
Każda tablica ma typ danych, który różni się od typu danych jego elementów. Brak pojedynczego typu danych dla wszystkich tablic. Zamiast tego typ danych tablicy jest określany przez liczbę wymiarów lub rangę tablicy oraz typ danych elementów w tablicy. Dwie zmienne tablicowe są tego samego typu danych tylko wtedy, gdy mają tę samą rangę, a ich elementy mają ten sam typ danych. Długość wymiarów tablicy nie wpływa na typ danych tablicy.
Każda tablica dziedziczy z System.Array klasy i można zadeklarować zmienną Arraytypu , ale nie można utworzyć tablicy typu Array. Na przykład, chociaż poniższy kod deklaruje zmienną arr typu Array i wywołuje Array.CreateInstance metodę w celu utworzenia wystąpienia tablicy, typ tablicy okazuje się być Obiekt[].
VB
Module Example
PublicSub Main()
Dim arr As Array = Array.CreateInstance(GetType(Object), 19)
Console.WriteLine(arr.Length)
Console.WriteLine(arr.GetType().Name)
EndSubEndModule' The example displays the following output:' 19' Object[]
Ponadto instrukcja ReDim nie może działać na zmiennej zadeklarowanej jako typ Array. Z tych powodów i bezpieczeństwa typu zaleca się zadeklarowanie każdej tablicy jako określonego typu.
Typ danych tablicy lub jej elementów można znaleźć na kilka sposobów.
Możesz wywołać metodę GetType w zmiennej, aby uzyskać Type obiekt reprezentujący typ czasu wykonywania zmiennej. Obiekt Type zawiera obszerne informacje we właściwościach i metodach.
Zmienną można przekazać do TypeName funkcji, aby uzyskać String nazwę typu czasu wykonywania.
Poniższy przykład wywołuje zarówno metodę GetType , jak i TypeName funkcję w celu określenia typu tablicy. Typ tablicy to Byte(,). Należy pamiętać, że Type.BaseType właściwość wskazuje również, że podstawowym typem Array tablicy bajtów jest klasa.
VB
Module Example
PublicSub Main()
Dim bytes(9,9) AsByte
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)}")
EndSubEndModule' The example displays the following output:' Type of bytes array: Byte[,]' Base class of bytes: Array' ' Type of bytes array: Byte(,)
Tablice jako wartości zwracane i parametry
Aby zwrócić tablicę Function z procedury, określ typ danych tablicy i liczbę wymiarów jako zwracany typ instrukcji funkcji. W ramach funkcji zadeklaruj zmienną tablicy lokalnej o tym samym typie danych i liczbie wymiarów. W instrukcji Return dołącz zmienną tablicy lokalnej bez nawiasów.
Aby określić tablicę jako parametr Sub do procedury lub Function , zdefiniuj parametr jako tablicę z określonym typem danych i liczbą wymiarów. W wywołaniu procedury przekaż zmienną tablicową o tym samym typie danych i liczbie wymiarów.
W poniższym przykładzie GetNumbers funkcja zwraca tablicę Integer()jednowymiarową typu Integer. Procedura ShowNumbers akceptuje Integer() argument.
VB
Module ReturnValuesAndParams
PublicSub Main()
Dim numbers AsInteger() = GetNumbers()
ShowNumbers(numbers)
EndSubPrivateFunction GetNumbers() AsInteger()
Dim numbers AsInteger() = {10, 20, 30}
Return numbers
EndFunctionPrivateSub ShowNumbers(numbers AsInteger())
For index = 0To numbers.GetUpperBound(0)
Console.WriteLine($"{numbers(index)} ")
NextEndSubEndModule' The example displays the following output:' 10' 20' 30
W poniższym przykładzie GetNumbersMultiDim funkcja zwraca tablicę Integer(,)dwuwymiarową typu Integer. Procedura ShowNumbersMultiDim akceptuje Integer(,) argument.
VB
Module Example
PublicSub Main()
Dim numbers AsInteger(,) = GetNumbersMultidim()
ShowNumbersMultidim(numbers)
EndSubPrivateFunction GetNumbersMultidim() AsInteger(,)
Dim numbers AsInteger(,) = {{1, 2}, {3, 4}, {5, 6}}
Return numbers
EndFunctionPrivateSub ShowNumbersMultidim(numbers AsInteger(,))
For index0 = 0To numbers.GetUpperBound(0)
For index1 = 0To numbers.GetUpperBound(1)
Console.Write($"{numbers(index0, index1)} ")
Next
Console.WriteLine()
NextEndSubEndModule' The example displays the following output:' 1 2' 3 4' 5 6
Tablice poszarpane
Czasami struktura danych w aplikacji jest dwuwymiarowa, ale nie prostokątna. Na przykład można użyć tablicy do przechowywania danych o wysokiej temperaturze każdego dnia miesiąca. Pierwszy wymiar tablicy reprezentuje miesiąc, ale drugi wymiar reprezentuje liczbę dni, a liczba dni w miesiącu nie jest jednolita. Tablica poszarpana, nazywana również tablicą tablic, jest przeznaczona dla takich scenariuszy. Poszarpana tablica to tablica, której elementy są również tablicami. Poszarpana tablica i każdy element w poszarpanej tablicy może mieć co najmniej jeden wymiar.
W poniższym przykładzie użyto tablicy miesięcy, z których każdy element jest tablicą dni. W przykładzie użyto tablicy poszarpanej, ponieważ różne miesiące mają różne liczby dni. W przykładzie pokazano, jak utworzyć poszarpaną tablicę, przypisać do niej wartości i pobrać i wyświetlić jej wartości.
W poprzednim przykładzie wartości są przypisywane do tablicy poszarpanej na podstawie elementu według elementu przy użyciu For...Next pętli. Wartości można również przypisać do elementów tablicy poszarpanej przy użyciu zagnieżdżonych literałów tablicy. Jednak próba użycia zagnieżdżonych literałów tablicy (na przykład Dim valuesjagged = {{1, 2}, {2, 3, 4}}) generuje błąd kompilatora BC30568. Aby poprawić błąd, należy ująć literały tablicy wewnętrznej w nawiasy. Nawiasy wymuszają obliczanie wyrażenia literału tablicy, a wynikowe wartości są używane z zewnętrznym literałem tablicy, jak pokazano w poniższym przykładzie.
VB
Module Example
PublicSub Main()
Dim values1d = { 1, 2, 3 }
Dim values2d = {{1, 2}, {2, 3}, {3, 4}}
Dim valuesjagged = {({1, 2}), ({2, 3, 4})}
EndSubEndModule
Poszarpana tablica to tablica jednowymiarowa, której elementy zawierają tablice. W związku z Array.Length tym właściwość i Array.GetLength(0) metoda zwracają liczbę elementów w tablicy jednowymiarowej i Array.GetLength(1) zgłasza wartość IndexOutOfRangeException , ponieważ tablica poszarpana nie jest wielowymiarowa. Liczbę elementów w każdym podarraie można określić, pobierając wartość właściwości podarray Array.Length . W poniższym przykładzie pokazano, jak określić liczbę elementów w tablicy poszarpanej.
VB
Module Example
PublicSub 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 AsInteger = 0To 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}")
EndSubEndModule' 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
Tablice o zerowej długości
Visual Basic rozróżnia tablicę niezainicjowaną (tablicę, której wartość to Nothing) oraz tablicę o zerowej długości lub pustą tablicę (tablicę, która nie ma elementów). Niezainicjowana tablica to tablica, która nie została wymiarowana ani nie miała przypisanych do niej żadnych wartości. Na przykład:
VB
Dim arr() AsString
Tablica o zerowej długości jest zadeklarowana z wymiarem -1. Na przykład:
VB
Dim arrZ(-1) AsString
W następujących okolicznościach może być konieczne utworzenie tablicy o zerowej długości:
Bez ryzyka NullReferenceException wyjątku kod musi uzyskiwać dostęp do składowych Array klasy, takich jak lub Rank, lub wywołać funkcję Visual Basic, taką jak LengthUBound.
Chcesz, aby kod był prosty, nie musisz sprawdzać Nothing ich jako specjalnego przypadku.
Kod współdziała z interfejsem programowania aplikacji (API), który wymaga przekazania tablicy o zerowej długości do co najmniej jednej procedury lub zwraca tablicę o zerowej długości z co najmniej jednej procedury.
Dzielenie tablicy
W niektórych przypadkach może być konieczne podzielenie jednej tablicy na wiele tablic. Obejmuje to identyfikację punktu lub punktów, w których tablica ma zostać podzielona, a następnie plucie tablicy na co najmniej dwie oddzielne tablice.
Uwaga
W tej sekcji nie omówiono dzielenia pojedynczego ciągu na tablicę ciągów na podstawie ogranicznika. Aby uzyskać informacje na temat dzielenia ciągu, zobacz metodę String.Split .
Najczęstsze kryteria dzielenia tablicy to:
Liczba elementów w tablicy. Na przykład możesz podzielić tablicę więcej niż określoną liczbę elementów na liczbę w przybliżeniu równych części. W tym celu można użyć wartości zwracanej przez metodę Array.Length lub Array.GetLength .
Wartość elementu, który służy jako ogranicznik, który wskazuje, gdzie tablica powinna być podzielona. Możesz wyszukać określoną wartość, wywołując Array.FindIndex metody i Array.FindLastIndex .
Po określeniu indeksu lub indeksów, w których tablica ma zostać podzielona, możesz utworzyć poszczególne tablice, wywołując metodę Array.Copy .
W poniższym przykładzie tablica jest podzielona na dwie tablice o równym rozmiarze. (Jeśli całkowita liczba elementów tablicy jest dziwna, pierwsza tablica ma więcej elementów niż drugi).
VB
Module Example
PublicSub Main()
' Create an array of 100 elements.Dim arr(99) AsInteger' Populate the array.Dim rnd Asnew Random()
For ctr = 0To arr.GetUpperBound(0)
arr(ctr) = rnd.Next()
Next' Determine how many elements should be in each array.Dim divisor = 2Dim remainder AsIntegerDim boundary = Math.DivRem(arr.GetLength(0), divisor, remainder)
' Copy the array.Dim arr1(boundary - 1 + remainder), arr2(boundary - 1) asInteger
Array.Copy(arr, 0, arr1, 0, boundary + remainder)
Array.Copy(arr, boundary + remainder, arr2, 0, arr.Length - boundary)
EndSubEndModule
Poniższy przykład dzieli tablicę ciągów na dwie tablice na podstawie obecności elementu, którego wartość to "zzz", który służy jako ogranicznik tablicy. Nowe tablice nie zawierają elementu zawierającego ogranicznik.
VB
Module Example
PublicSub Main()
Dim rnd AsNew Random()
' Create an array of 100 elements.Dim arr(99) AsString' Populate each element with an arbitrary ASCII character.For ctr = 0To 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) AsStringDim arr2(arr.GetUpperBound(0) - location - 1) AsString' Populate the two arrays.
Array.Copy(arr, 0, arr1, 0, location)
Array.Copy(arr, location + 1, arr2, 0, arr.GetUpperBound(0) - location)
EndSubEndModule
Łączenie tablic
Można również połączyć wiele tablic w jedną większą tablicę. W tym celu należy również użyć Array.Copy metody .
Uwaga
W tej sekcji nie omówiono łączenia tablicy ciągów w jeden ciąg. Aby uzyskać informacje na temat dołączania tablicy ciągów, zobacz metodę String.Join .
Przed skopiowaniem elementów każdej tablicy do nowej tablicy należy najpierw upewnić się, że tablica została zainicjowana tak, aby była wystarczająco duża, aby pomieścić nową tablicę. Można to zrobić na jeden z dwóch sposobów:
Użyj instrukcji ReDim Preserve , aby dynamicznie rozwinąć tablicę przed dodaniem do niej nowych elementów. Jest to najłatwiejsza technika, ale może to spowodować obniżenie wydajności i nadmierne zużycie pamięci podczas kopiowania dużych tablic.
Oblicz całkowitą liczbę elementów potrzebnych dla nowej dużej tablicy, a następnie dodaj do niej elementy każdej tablicy źródłowej.
W poniższym przykładzie użyto drugiego podejścia do dodania czterech tablic z dziesięcioma elementami do pojedynczej tablicy.
VB
Imports System.Collections.Generic
Imports System.Threading.Tasks
Module Example
PublicSub Main()
Dim tasks AsNew List(Of Task(OfInteger()))
' Generate four arrays.For ctr = 0To3Dim value = ctr
tasks.Add(Task.Run(Function()
Dim arr(9) AsIntegerFor ndx = 0To arr.GetUpperBound(0)
arr(ndx) = value
NextReturn arr
EndFunction))
Next
Task.WaitAll(tasks.ToArray())
' Compute the number of elements in all arrays.Dim elements = 0ForEach task In tasks
elements += task.Result.Length
NextDim newArray(elements - 1) AsIntegerDim index = 0ForEach 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.")
EndSubEndModule' The example displays the following output:' The new array has 40 elements.
Ponieważ w tym przypadku tablice źródłowe są małe, możemy również dynamicznie rozwijać tablicę, dodając do niej elementy każdej nowej tablicy. Poniższy przykład to robi.
VB
Imports System.Collections.Generic
Imports System.Threading.Tasks
Module Example
PublicSub Main()
Dim tasks AsNew List(Of Task(OfInteger()))
' Generate four arrays.For ctr = 0To3Dim value = ctr
tasks.Add(Task.Run(Function()
Dim arr(9) AsIntegerFor ndx = 0To arr.GetUpperBound(0)
arr(ndx) = value
NextReturn arr
EndFunction))
Next
Task.WaitAll(tasks.ToArray())
' Dimension the target array and copy each element of each source array to it.Dim newArray() AsInteger = {}
' Define the next position to copy to in newArray.Dim index = 0ForEach task In tasks
Dim n = Task.Result.Length
ReDimPreserve 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.")
EndSubEndModule' The example displays the following output:' The new array has 40 elements.
Kolekcje jako alternatywa dla tablic
Tablice są najbardziej przydatne do tworzenia i pracy z stałą liczbą silnie typiowanych obiektów. Kolekcje zapewniają bardziej elastyczny sposób pracy z grupami obiektów. W przeciwieństwie do tablic, które wymagają jawnej zmiany rozmiaru tablicy za pomocą ReDim instrukcji, kolekcje rosną i kurczą się dynamicznie w miarę zmiany potrzeb aplikacji.
Gdy używasz ReDim polecenia do ponownego utworzenia tablicy, Visual Basic tworzy nową tablicę i zwalnia poprzednią. Trwa to czas wykonywania. W związku z tym, jeśli liczba elementów, z których często pracujesz, lub nie można przewidzieć maksymalnej liczby potrzebnych elementów, zwykle uzyskasz lepszą wydajność przy użyciu kolekcji.
W przypadku niektórych kolekcji można przypisać klucz do dowolnego obiektu umieszczonego w kolekcji, aby można było szybko pobrać obiekt przy użyciu klucza .
Jeśli kolekcja zawiera elementy tylko jednego typu danych, możesz użyć jednej z klas w System.Collections.Generic przestrzeni nazw. Kolekcja ogólna wymusza bezpieczeństwo typów, aby nie można było do niego dodać żadnego innego typu danych.
Aby uzyskać więcej informacji na temat kolekcji, zobacz Kolekcje.
Dołącz do serii meetup, aby tworzyć skalowalne rozwiązania sztucznej inteligencji oparte na rzeczywistych przypadkach użycia z innymi deweloperami i ekspertami.