Pole v jazyce Visual Basic
Pole je sada hodnot, které jsou výrazy, které jsou logicky vzájemně propojené. Pole může například sestávat z počtu studentů v každé třídě v gramatické škole; Každý prvek pole je počet studentů v jedné třídě. Podobně může pole sestávat ze tříd studenta pro třídu; Každý prvek pole je jednou ze stupňů.
Je možné použít jednotlivé proměnné pro uložení každé z našich datových položek. Například pokud naše aplikace analyzuje třídy studenta, můžeme použít samostatnou proměnnou pro každou třídu studenta, jako englishGrade1 je například, englishGrade2 atd. Tento přístup má tři hlavní omezení:
- V době návrhu musíme přesně zjistit, kolik stupňů potřebujeme zpracovat.
- Rychlé zpracování velkého počtu druhů se nepraktický. Tím dojde k tomu, že aplikace bude mnohem pravděpodobnější, že bude mít vážné chyby.
- Údržbu je obtížné. Každou novou třídu, kterou přidáváme, vyžaduje, aby se aplikace upravila, znovu zkompiluje a znovu nasadila.
Pomocí pole můžete odkazovat na tyto související hodnoty se stejným názvem a použít číslo, které se nazývá index nebo dolní index k identifikaci jednotlivého prvku na základě jeho pozice v poli. Indexy rozsahu pole od 0 do jednoho menšího než celkový počet prvků v poli. použijete-li syntaxi Visual Basic k definování velikosti pole, určíte jeho nejvyšší index, nikoli celkový počet prvků v poli. S polem můžete pracovat jako s jednotkou a možnost iterovat své prvky je nepotřebné k tomu, abyste přesně věděli, kolik prvků obsahuje v době návrhu.
Některé rychlé příklady před vysvětlením:
' 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(3, 2) {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}}
' Declare a jagged array
Dim sales()() As Double = New Double(11)() {}
Prvky pole v jednoduchém poli
Pojďme vytvořit pole s názvem students pro uložení počtu studentů v každé třídě v gramatické škole. Indexy prvků jsou v rozsahu od 0 do 6. Použití tohoto pole je jednodušší než deklarace sedmi proměnných.
Následující ilustrace znázorňuje students pole. Pro každý prvek pole:
Index elementu reprezentuje třídu (index 0 představuje kindergarten).
Hodnota, která je obsažena v elementu, představuje počet studentů v této třídě.

následující příklad obsahuje kód Visual Basic, který vytváří a používá pole:
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
Příklad provádí tři věci:
- Deklaruje
studentspole s sedmi prvky. Číslo6v deklaraci pole označuje poslední index v poli, je menší než počet prvků v poli. - Přiřadí hodnoty každému prvku v poli. K prvkům pole se dostanete pomocí názvu pole a zahrnutím indexu jednotlivého prvku do závorek.
- Obsahuje seznam všech hodnot pole. V příkladu se používá
Forpříkaz pro přístup k jednotlivým prvkům pole podle jeho čísla indexu.
studentsPole v předchozím příkladu je jednorozměrné pole, protože používá jeden index. Pole, které používá více než jeden index nebo dolní index, je označováno jako multidimenzionální. Další informace najdete v tématu zbývající část tohoto článku a rozměry pole v Visual Basic.
Vytvoření pole
Velikost pole můžete definovat několika způsoby:
Můžete určit velikost při deklaraci pole:
' 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 StringMůžete použít
Newklauzuli k poskytnutí velikosti pole při jeho vytvoření:' 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)() {}
Máte-li existující pole, lze jeho velikost změnit pomocí ReDim příkazu. Můžete určit, že ReDim příkaz zachová hodnoty, které jsou v poli, nebo můžete určit, že vytvoří prázdné pole. Následující příklad ukazuje různá použití ReDim příkazu pro úpravu velikosti existujícího pole.
' 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)
Další informace naleznete v příkazu ReDim.
Ukládání hodnot do pole
Ke každému umístění v poli můžete přistupovat pomocí indexu typu Integer . Můžete uložit a načíst hodnoty v poli odkazem na každé umístění pole pomocí jeho indexu uzavřeného v závorkách. Indexy multidimenzionálních polí jsou odděleny čárkami (,). Pro každou dimenzi pole potřebujete jeden index.
Následující příklad ukazuje některé příkazy, které ukládají a načítají hodnoty v polích.
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
Naplnění pole pomocí literálů pole
Pomocí literálu pole lze naplnit pole počáteční sadou hodnot ve stejnou dobu, kterou vytvoříte. Literál pole se skládá ze seznamu hodnot oddělených čárkami, které jsou uzavřeny ve složených závorkách ( {} ).
Při vytváření pole pomocí literálu pole můžete buď zadat typ pole nebo použít odvození typu k určení typu pole. Následující příklad ukazuje obě možnosti.
' 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 }
Při použití odvození typu je typ pole určen dominantním typem v seznamu hodnot literálů. Dominantní typ je typ, na který lze rozšířit všechny ostatní typy v poli. Pokud tento jedinečný typ nelze určit, dominantní typ je jedinečný typ, na který mohou být zúženy všechny ostatní typy v poli. Pokud ani jeden z těchto jedinečných typů nelze určit, dominantní typ je Object . Například pokud seznam hodnot, které jsou zadány do literálu pole, obsahuje hodnoty typu Integer , Long , a Double výsledné pole je typu Double . Protože Integer a Long rozšíření pouze na Double , Double je dominantní typ. Další informace najdete v tématu rozšiřování a zúžení převodů.
Poznámka
Odvození typu lze použít pouze pro pole, která jsou definována jako lokální proměnné v rámci člena typu. Pokud není k dispozici definice explicitního typu, pole definovaná s literály pole na úrovni třídy jsou typu Object[] . Další informace naleznete v tématu odvození místního typu.
Všimněte si, že předchozí příklad definuje values jako pole typu, Double i když všechny literály pole jsou typu Integer . Toto pole lze vytvořit, protože hodnoty v literálu pole lze rozšířit na Double hodnoty.
Můžete také vytvořit a naplnit multidimenzionální pole pomocí literálů vnořeného pole. Literály vnořeného pole musí obsahovat řadu dimenzí, které jsou konzistentní s výsledným polem. Následující příklad vytvoří dvojrozměrné pole celých čísel pomocí literálů vnořeného pole.
' 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}}
Při použití literálů vnořeného pole k vytvoření a naplnění pole dojde k chybě, pokud se počet prvků v literálech vnořeného pole neshoduje. K chybě dojde také v případě, že explicitně deklarujete proměnnou pole tak, aby měla jiný počet rozměrů než literály pole.
Stejně jako u jednorozměrného pole lze při vytváření multidimenzionálního pole s literály vnořeného pole spoléhat na odvození typu. Odvozený typ je dominantní typ pro všechny hodnoty ve všech literálech pole pro všechny úrovně vnoření. Následující příklad vytvoří dvourozměrné pole typu Double[,] z hodnot, které jsou typu Integer a Double .
Dim arr = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}
Další příklady naleznete v tématu How to: Initialize a Array Variable in Visual Basic.
Iterace prostřednictvím pole
Při iteraci přes pole přistupujete ke každému prvku v poli z nejnižší index na nejvyšší nebo od nejvyšších po nejnižší. Obvykle použijte buď pro... Další příkaz nebo pro každý... Další příkaz pro iteraci prvky pole. Pokud neznáte horní meze pole, můžete zavolat Array.GetUpperBound metodu pro získání nejvyšší hodnoty indexu. I když nejnižší hodnota indexu je skoro vždycky 0, můžete zavolat Array.GetLowerBound metodu, abyste získali nejnižší hodnotu indexu.
Následující příklad projde jednorozměrné pole pomocí For...Next příkazu.
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
Následující příklad provede iteraci multidimenzionálního pole pomocí For...Next příkazu. GetUpperBoundMetoda má parametr, který určuje dimenzi. GetUpperBound(0) Vrátí nejvyšší index prvního rozměru a GetUpperBound(1) vrátí nejvyšší index druhé dimenze.
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
Následující příklad používá pro každý... Další příkazpro iterování pomocí jednorozměrného pole a dvojrozměrného pole.
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
Velikost pole
Velikost pole je součinem délek všech jeho rozměrů. Představuje celkový počet prvků, které jsou aktuálně obsaženy v poli. Například následující příklad deklaruje dvojrozměrné pole se čtyřmi prvky v každé dimenzi. Jak ukazuje výstup z příkladu, je velikost pole 16 (nebo (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
Poznámka
Tato diskuze o velikosti pole se nevztahuje na vícenásobná pole. Informace o vícenásobných polích a určení velikosti vícenásobného pole naleznete v části vícenásobná pole .
Velikost pole můžete najít pomocí Array.Length Vlastnosti. Délku každé dimenze multidimenzionálního pole lze najít pomocí Array.GetLength metody.
Můžete změnit velikost proměnné pole přiřazením nového objektu Array k poli nebo pomocí příkazu ReDim příkazu . Následující příklad používá ReDim příkaz ke změně pole 100 elementu na pole 51-element.
Module Example
Public Sub Main()
Dim arr(99) As Integer
Console.WriteLine(arr.Length)
Redim arr(50)
Console.WriteLine(arr.Length)
End Sub
End Module
' The example displays the following output:
' 100
' 51
Při práci s velikostí pole je potřeba mít na paměti několik věcí.
| Poznámky | |
|---|---|
| Délka dimenze | Index každé dimenze je založen na 0, což znamená, že je rozsah od 0 do horní meze. Proto je délka dané dimenze jedna větší než deklarovaná horní mez této dimenze. |
| Omezení délky | Délka každé dimenze pole je omezená na maximální hodnotu Integer datového typu, což je Int32.MaxValue nebo (2 ^ 31)-1. Celková velikost pole je ale také omezená pamětí, která je k dispozici ve vašem systému. Pokud se pokusíte inicializovat pole, které překračuje množství dostupné paměti, modul runtime vyvolá OutOfMemoryException . |
| Velikost a velikost elementu | Velikost pole je nezávislá na datovém typu jeho prvků. Velikost vždy představuje celkový počet prvků, nikoli počet bajtů, které spotřebovávají v paměti. |
| Spotřeba paměti | Není bezpečné dělat žádné předpoklady týkající se toho, jak je pole Uloženo v paměti. Storage se liší od platforem různých šířek dat, takže stejné pole může spotřebovávat více paměti v 64 systému, než na 32 systému. V závislosti na konfiguraci systému při inicializaci pole může modul CLR (Common Language Runtime) přiřadit úložiště buď k zabalení prvků co nejblíže, nebo pro jejich zarovnání na hranice přirozeného hardwaru. Pole také vyžaduje režijní náklady na úložiště pro informace o ovládacím prvku a tato režie se zvyšuje s každou přidanou dimenzí. |
Typ pole
Každé pole má datový typ, který se liší od datového typu jeho prvků. Pro všechna pole není k dispozici žádný jediný datový typ. Místo toho se datový typ pole určuje podle počtu rozměrů nebo pořadí, pole a datového typu prvků v poli. Dvě proměnné pole jsou stejného datového typu pouze v případě, že mají stejný rozsah a jejich prvky mají stejný datový typ. Délky rozměrů pole neovlivňují datový typ pole.
Každé pole dědí z System.Array třídy a můžete deklarovat proměnnou, která má být typu Array , ale nelze vytvořit pole typu Array . Například Přestože následující kód deklaruje arr proměnnou jako typ Array a volá Array.CreateInstance metodu pro vytvoření instance pole, typ pole se projeví jako objekt [].
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[]
Příkaz ReDim nelze také použít pro proměnnou deklarovanou jako typ Array . Z těchto důvodů a pro bezpečnost typů je vhodné deklarovat každé pole jako konkrétní typ.
Datový typ pole nebo jeho prvků můžete zjistit několika způsoby.
- Můžete zavolat GetType metodu na proměnnou a získat tak Type objekt, který představuje běhový typ proměnné. TypeObjekt obsahuje rozsáhlé informace o vlastnostech a metodách.
- Proměnnou můžete předat do TypeName funkce a získat tak
Stringnázev typu za běhu.
Následující příklad volá jak GetType metodu, tak TypeName funkci pro určení typu pole. Typ pole je Byte(,) . Všimněte si, že Type.BaseType vlastnost také označuje, že základní typ bajtového pole je Array Třída.
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(,)
Pole jako návratové hodnoty a parametry
Chcete-li vrátit pole z Function procedury, zadejte datový typ Array a počet dimenzí jako návratový typ příkazu funkce. V rámci funkce deklarujte místní proměnnou pole se stejným datovým typem a počtem rozměrů. V příkazu returnzahrňte proměnnou místního pole bez závorek.
Chcete-li určit pole jako parametr pro Sub Function proceduru nebo, definujte parametr jako pole se zadaným datovým typem a počtem dimenzí. V volání procedury předejte proměnnou pole se stejným datovým typem a počtem dimenzí.
V následujícím příkladu GetNumbers funkce vrací jednorozměrné Integer() pole typu Integer . ShowNumbersProcedura přijímá 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
V následujícím příkladu GetNumbersMultiDim funkce vrací dvojrozměrné Integer(,) pole typu Integer . ShowNumbersMultiDimProcedura přijímá 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
Vícenásobná pole
V některých případech je struktura dat ve vaší aplikaci dvourozměrná, ale ne pravoúhlá. Například můžete použít pole k ukládání dat o vysoké teplotě každého dne v měsíci. První rozměr pole představuje měsíc, ale druhá dimenze představuje počet dní a počet dní v měsíci není stejnorodý. Vícenásobné pole, které se označuje také jako pole polí, je navrženo pro tyto scénáře. Vícenásobné pole je pole, jehož prvky jsou také pole. Vícenásobné pole a každý prvek ve vícenásobném poli může mít jednu nebo více dimenzí.
Následující příklad používá pole měsíců, přičemž každý prvek je pole dnů. V příkladu se používá vícenásobné pole, protože různé měsíce mají různý počet dnů. Tento příklad ukazuje, jak vytvořit vícenásobné pole, přiřadit k němu hodnoty a načíst a zobrazit jeho hodnoty.
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
Předchozí příklad přiřadí hodnoty vícenásobnému poli na základě prvku pomocí For...Next smyčky. Můžete také přiřadit hodnoty prvkům vícenásobného pole pomocí literálů vnořeného pole. Pokus o použití literálů vnořeného pole (například Dim valuesjagged = {{1, 2}, {2, 3, 4}} ) vygeneruje chybu kompilátoru BC30568. Chcete-li chybu opravit, vložte literály vnitřních polí do závorek. Závorky přinutí vyhodnotit výraz literálu pole a výsledné hodnoty jsou použity s vnějším literálem pole, jak ukazuje následující příklad.
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
Vícenásobné pole je jednorozměrné pole, jehož prvky obsahují pole. Proto Array.Length vlastnost a Array.GetLength(0) Metoda vrátí počet prvků v jednorozměrném poli a Array.GetLength(1) vyvolá výjimku, IndexOutOfRangeException protože vícenásobné pole není vícerozměrné. Určíte počet prvků v každém podpoli načtením hodnoty vlastnosti každého podpole Array.Length . Následující příklad ukazuje, jak určit počet prvků ve vícenásobném poli.
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
Pole s nulovou délkou
Visual Basic rozlišuje mezi neinicializovaným polem (polem, jehož hodnota je Nothing ) a polem s nulovou délkou nebo prázdným polem (pole, které neobsahuje žádné prvky.) Neinicializovaný objekt Array je ten, který nemá vytvořenou dimenzi nebo k němu byly přiřazeny nějaké hodnoty. Příklad:
Dim arr() As String
Pole s nulovou délkou je deklarováno s rozměrem-1. Příklad:
Dim arrZ(-1) As String
Pole s nulovou délkou možná budete muset vytvořit za následujících okolností:
aniž by došlo k NullReferenceException výjimce, váš kód musí mít přístup ke členům třídy, jako je například Array Length nebo Rank , nebo volat funkci Visual Basic, jako je například UBound .
Chcete, aby byl kód jednoduchý, nemusíte ho kontrolovat
Nothingjako zvláštní případ.Váš kód komunikuje s rozhraním API (Application Programming Interface), které vyžaduje, abyste předávali pole nulové délky k jednomu nebo více procedurám nebo v jednom nebo více postupech vrátili pole s nulovou délkou.
Rozdělení pole
V některých případech může být nutné rozdělit jedno pole do více polí. To zahrnuje identifikaci bodu nebo bodů, ve kterých má být pole rozděleno, a pak Spitting pole do dvou nebo více samostatných polí.
Poznámka
Tato část nepopisuje rozdělení jednoho řetězce do pole řetězců na základě některého oddělovače. Informace o rozdělení řetězce naleznete v String.Split metodě.
Nejběžnější kritéria pro rozdělení pole jsou:
Počet prvků v poli. Například můžete chtít rozdělit pole více než zadaný počet prvků na číslo přibližně stejné části. Pro účely tohoto účelu můžete použít hodnotu vrácenou Array.Length Array.GetLength metodou nebo.
Hodnota prvku, který slouží jako oddělovač, který označuje, kde má být pole rozděleno. Konkrétní hodnotu můžete vyhledat voláním Array.FindIndex Array.FindLastIndex metod a.
Jakmile určíte index nebo indexy, u kterých má být pole rozděleno, můžete vytvořit jednotlivá pole voláním Array.Copy metody.
Následující příklad rozdělí pole do dvou polí přibližně stejné velikosti. (Pokud celkový počet elementů pole je lichý, první pole má jeden další prvek než druhý.)
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
Následující příklad rozdělí pole řetězců do dvou polí na základě přítomnosti elementu, jehož hodnota je "ZZZ", která slouží jako oddělovač pole. Nová pole neobsahují element, který obsahuje oddělovač.
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
Spojování polí
V jednom větším poli můžete také zkombinovat několik polí. K tomu můžete použít také Array.Copy metodu.
Poznámka
Tato část se nezabývá připojením pole řetězců k jednomu řetězci. Informace o spojování pole řetězců naleznete v String.Join metodě.
Před zkopírováním prvků každého pole do nového pole je nutné nejprve zajistit, aby bylo pole inicializováno tak, aby bylo dostatečně velké, aby bylo možné přizpůsobit novému poli. Toto lze provést jedním ze dvou způsobů:
- Použijte
ReDim Preservepříkaz k dynamickému rozbalení pole před přidáním nových prvků do něj. Toto je nejjednodušší postup, ale může způsobit snížení výkonu a nadměrné využití paměti při kopírování velkých polí. - Vypočítá celkový počet prvků potřebných pro nové velké pole a potom do něj přidejte prvky každého zdrojového pole.
Následující příklad používá druhý přístup pro přidání čtyř polí s deseti prvky každý do jednoho pole.
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.
Vzhledem k tomu, že v tomto případě jsou zdrojová pole malá, můžeme také dynamicky rozšířit pole, protože do něj přidáte prvky každého nového pole. V následujícím příkladu je to.
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.
Kolekce jako alternativa k polím
Pole jsou nejužitečnější pro vytváření objektů silného typu a práci s ním. Kolekce nabízejí flexibilnější způsob práce se skupinami objektů. Na rozdíl od polí, která vyžadují explicitní změnu velikosti pole pomocí příkazu ReDim ,kolekce se dynamicky zvětšují a zmenšují podle potřeb aplikace.
Když použijete k redimenzi pole, Visual Basic vytvoří nové pole a uvolní ReDim předchozí pole. To trvá dlouho. Proto pokud počet položek, se kterou pracujete často, nebo nemůžete predikovat maximální počet položek, které potřebujete, obvykle získáte lepší výkon pomocí kolekce.
U některých kolekcí můžete klíč přiřadit libovolnému objektu, který jste vložili do kolekce, abyste ho mohli rychle načíst pomocí klíče.
Pokud vaše kolekce obsahuje prvky pouze jednoho datového typu, můžete použít jednu z tříd v oboru System.Collections.Generic názvů . Obecná kolekce vynucuje bezpečnost typů, aby do ní nebyl možné přidat žádný jiný datový typ.
Další informace o kolekcích najdete v tématu Kolekce.
Související témata
| Pojem | Definice |
|---|---|
| Rozměry pole v jazyce Visual Basic | Vysvětluje pořadí a dimenze v polích. |
| Postupy: Inicializace proměnné pole v jazyce Visual Basic | Popisuje, jak naplnit pole počátečními hodnotami. |
| Postupy: Řazení pole v jazyce Visual Basic | Ukazuje, jak seřadit prvky pole podle abecedy. |
| Postupy: Přiřazení jednoho pole ke druhému | Popisuje pravidla a kroky pro přiřazení pole k jiné proměnné pole. |
| Řešení potíží s poli | Popisuje některé běžné problémy, ke které dochází při práci s poli. |