Matice v jazyce Visual Basic
Pole je sada hodnot, které jsou logicky vzájemně souvisí, jako je například počet studentů v každé třídy ve škole gramatiky.
Pomocí pole můžete odkazovat na tyto související hodnoty se stejným názvem a použijte číslo, které se nazývá index nebo dolní index si od sebe.Jednotlivé hodnoty se nazývají prvky pole.Kvůli souvislé z indexu 0 až na nejvyšší hodnotu indexu.
Na rozdíl od pole, se nazývá proměnné, které obsahují pouze jednu hodnotu Skalární proměnné.
V tomto tématu
Prvky pole v jednoduché pole
Vytvoření matice
Deklarování matice
Ukládání hodnot v matici
Vyplnění pole počáteční hodnoty
- Vnořené literály pole
Iterace matice
Pole jako parametry a návratové hodnoty
Vícenásobná pole
Pole nulové délky
Velikost pole
Typy polí a dalších typů
Kolekce jako alternativu k matice
Prvky pole v jednoduché pole
Následující příklad deklaruje proměnnou pole k uložení počtu studentů v každé třídy ve škole gramatiky.
Dim students(6) As Integer
Matice students v předchozím příkladu obsahuje sedm prvky.Indexy prvků rozsah od 0 do 6.Toto pole je jednodušší než deklarování proměnných sedm.
Následující obrázek znázorňuje pole students.Pro každý prvek pole:
Index prvku představuje třída (index 0 představuje Mateřská škola).
Hodnota, která je obsažena v elementu představuje počet studentů v této platové třídě.
Prvky pole "studenty"
Následující příklad ukazuje, jak odkazovat na první, druhý a poslední prvek matice students.
Dim kindergarten As Integer = students(0)
Dim firstGrade As Integer = students(1)
Dim sixthGrade As Integer = students(6)
MsgBox("Students in kindergarten = " & CStr(kindergarten))
MsgBox("Students in first grade = " & CStr(firstGrade))
MsgBox("Students in sixth grade = " & CStr(sixthGrade))
Odkazují na pole jako celek s použitím pouze názvu proměnné pole bez indexů.
Matice students v předchozím příkladu používá jeden rejstřík a je označováno jako jednorozměrné.Pole, které používá více než jeden index nebo dolní index, se nazývá multidimenzionální.Další informace naleznete v tématu zbývající části tohoto tématu a Rozměry pole v jazyce Visual Basic.
Vytvoření matice
Můžete definovat velikost pole několika způsoby.Při deklaraci pole, jak ukazuje následující příklad, můžete zadat velikost.
Dim cargoWeights(10) As Double
Dim atmospherePressures(2, 2, 4, 10) As Short
Dim inquiriesByYearMonthDay(20)()() As Byte
Můžete také použít New klauzule, chcete-li zadat velikost pole při jeho vytvoření, jak ukazuje následující příklad.
cargoWeights = New Double(10) {}
atmospherePressures = New Short(2, 2, 4, 10) {}
inquiriesByYearMonthDay = New Byte(20)()() {}
Pokud máte existující pole, můžete změnit jeho velikost pomocí Redim prohlášení.Můžete zadat, aby Redim příkaz by měl zachovat hodnoty, které jsou v poli nebo můžete určit, že jej vytvořit prázdné pole.Následující příklad ukazuje rozdílné použití Redim příkaz změnit velikost existujícího pole.
' Assign a new array size and retain the current element values.
ReDim Preserve cargoWeights(20)
' Assign a new array size and retain only the first five element values.
ReDim Preserve cargoWeights(4)
' Assign a new array size and discard all current element values.
ReDim cargoWeights(15)
Další informace naleznete v tématu ReDim prohlášení (Visual Basic).
Deklarování matice
Kterou deklarujete proměnnou pole stejným způsobem jako ostatní proměnné pomocí Dim prohlášení.Je-li postupovat podle typu nebo název proměnné s jedním nebo více dvojic závorky označují, že bude obsahovat pole spíše než skalární proměnné, která obsahuje pouze jednu hodnotu.
Po deklaraci pole můžete definovat jeho velikost pomocí ReDim prohlášení (Visual Basic).
Následující příklad deklaruje proměnnou jednorozměrné pole přidáním pár závorek za typu.Příklad také určuje rozměry matice pomocí ReDim prohlášení (Visual Basic).
' Declare a one-dimensional array.
Dim cargoWeights As Double()
' Dimension the array.
ReDim cargoWeights(15)
Následující příklad deklaruje proměnnou vícerozměrné pole tak, že přidáte dvojici závorek za typ a umístěním čárky v závorkách do samostatných rozměry.Příklad také určuje rozměry matice pomocí ReDim prohlášení (Visual Basic).
' Declare a multidimensional array.
Dim atmospherePressures As Short(,,,)
' Dimension the array.
ReDim atmospherePressures(1, 2, 3, 4)
K deklarování proměnné pole nepravidelného přidejte pár závorek za název proměnné pro každou úroveň vnořených pole.
Dim inquiriesByYearMonthDay()()() As Byte
Předchozí příklady deklaraci proměnných polí, ale nejsou k nim přiřadit matice.Stále musíte vytvořit pole, inicializovat a přiřadit proměnné.
Ukládání hodnot v matici
Každé umístění v poli přistupujete pomocí indexu typu Integer.Můžete uložit a načíst hodnoty v matici odkázáním se na každé pole umístění pomocí jeho index do závorek.Indexy pro Vícerozměrná pole jsou oddělena čárkou (,).Potřebujete jeden rejstřík pro každou dimenzi pole.Následující příklad ukazuje některé příkazy, které ukládají hodnoty v polích.
Dim i = 4
Dim j = 2
Dim numbers(10) As Integer
Dim matrix(5, 5) As Double
numbers(i + 1) = 0
matrix(3, j * 2) = j
Následující příklad ukazuje některé příkazy, které získávají hodnoty z pole.
Dim v = 2
Dim i = 1
Dim j = 1
Dim k = 1
Dim wTotal As Double = 0.0
Dim sortedValues(5), rawValues(5), estimates(2, 2, 2) As Double
Dim lowestValue = sortedValues(0)
wTotal += (rawValues(v) ^ 2)
Dim firstGuess = estimates(i, j, k)
Vyplnění pole počáteční hodnoty
Pomocí literálové pole můžete vytvořit pole, které obsahují počáteční sadu hodnot.Literál pole obsahuje seznam hodnot oddělených čárkami, které jsou uzavřeny ve složených závorkách ({}).
Při vytváření pole pomocí literálové pole můžete zadat typ pole nebo typ matice můžete určit pomocí odvození typu proměnné.Následující kód ukazuje obě možnosti.
Dim numbers = New Integer() {1, 2, 4, 8}
Dim doubles = {1.5, 2, 9.9, 18}
Při použití odvození typu proměnné typu pole je určena dominantní typ v seznamu hodnot dodaný pro pole literálů.Dominantní typ je jedinečný typ pro všechny ostatní typy pole literál rozšířit.Je-li tento jedinečný typ nelze určit, je dominantní typ jedinečný typ, do kterého můžete zúžit všechny druhy uvedené v poli.Pokud žádná z těchto jedinečných lze určit, je dominantní typ Object.Například pokud obsahuje seznam hodnot, dodaný do pole literálů hodnot typu Integer, Long, a Double, výsledné pole je typu Double.Both Integer and Long widen only to Double.Proto Double je dominantní typ.Další informace naleznete v tématu Rozšiřování a zužující převody (Visual Basic).Tato pravidla odvození platí pro typy, které jsou odvozeny pro pole, které jsou lokální proměnné, které jsou definovány v člen třídy.Přestože literály pole lze použít při vytváření proměnné na úrovni třídy, nelze použít odvození typu proměnné na úrovni třídy.V důsledku toho literály pole, které jsou určeny na úrovni třídy odvodit hodnoty, které jsou dodávány pro pole literálů jako typ Object.
Lze explicitně zadat typ prvků v matici, která je vytvořena pomocí literálové pole.V tomto případě hodnoty literálu pole musí rozšiřovat typ prvky pole.Následující příklad kódu vytvoří pole typu Double ze seznamu celých čísel.
Dim values As Double() = {1, 2, 3, 4, 5, 6}
Vnořené literály pole
Vícerozměrné pole můžete vytvořit pomocí vnořených pole literálů.Literály vnořená pole musí mít rozměr a počet rozměrů nebo hodnost, která je v souladu s výsledné pole.Následující příklad kódu vytvoří dvourozměrné pole celých čísel pomocí literálové pole.
Dim grid = {{1, 2}, {3, 4}}
V předchozím příkladu by dojít k chybě, pokud je počet prvků v literály vnořená pole neodpovídají.Je-li explicitně deklarovat proměnnou pole, chcete-li být jiné než dvojrozměrné by také dojít k chybě.
[!POZNÁMKA]
Zadáte-li literály vnořená pole z jiné dimenze uzavřením literály vnitřní pole do závorek lze zabránit chybě.Závorky vynutit literálový výraz pole mají být hodnoceny a výsledné hodnoty jsou používány s vnější pole literálů, jak ukazuje následující kód.
Dim values = {({1, 2}), ({3, 4, 5})}
Při vytváření vícerozměrné pole pomocí literály vnořená pole můžete použít k odvození typu proměnné.Použijete-li odvození typu proměnné, je inferred typu dominantní typ pro všechny hodnoty literály pole pro úroveň vnoření.Následující příklad kódu vytvoří dvourozměrné pole čísel typu Double z hodnot, které jsou typu Integer a Double.
Dim a = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}
Další příklady naleznete v tématu Postupy: Inicializace proměnné pole v jazyce Visual Basic.
Iterace matice
Při iteraci matice přístup k nejvyšší index každý prvek v poli od nejnižší index.
Tento příklad prochází jednorozměrné pole pomocí Pro...Další příkaz (Visual Basic).GetUpperBound Metoda vrátí nejvyšší hodnotu, která může mít index.Nejnižší hodnota indexu je vždy 0.
Dim numbers = {10, 20, 30}
For index = 0 To numbers.GetUpperBound(0)
Debug.WriteLine(numbers(index))
Next
' Output:
' 10
' 20
' 30
Tento příklad prochází vícerozměrné pole pomocí For...Next prohlášení.GetUpperBound Metoda má parametr, který určuje dimenzi.GetUpperBound(0)Vrátí hodnotu vysoký index pro první rozměr a GetUpperBound(1) vrátí hodnotu vysoký index pro druhý rozměr.
Dim numbers = {{1, 2}, {3, 4}, {5, 6}}
For index0 = 0 To numbers.GetUpperBound(0)
For index1 = 0 To numbers.GetUpperBound(1)
Debug.Write(numbers(index0, index1).ToString & " ")
Next
Debug.WriteLine("")
Next
' Output
' 1 2
' 3 4
' 5 6
Tento příklad prochází jednorozměrné pole pomocí Pro každý...Další příkaz (Visual Basic).
Dim numbers = {10, 20, 30}
For Each number In numbers
Debug.WriteLine(number)
Next
' Output:
' 10
' 20
' 30
Tento příklad prochází vícerozměrné pole pomocí For Each...Next prohlášení.Však máte větší kontrolu nad prvky vícerozměrné pole používáte-li vnořený For…Next prohlášení, stejně jako v předchozím příkladu, místo For Each…Next prohlášení.
Dim numbers = {{1, 2}, {3, 4}, {5, 6}}
For Each number In numbers
Debug.WriteLine(number)
Next
' Output:
' 1
' 2
' 3
' 4
' 5
' 6
Pole jako parametry a návratové hodnoty
Pro vrácení pole z Function postupu, zadejte pole datový typ a počet dimenzí jako návratový typ Příkaz funkce (Visual Basic).Ve funkci deklarujte proměnnou místní pole se stejným typem dat a počet rozměrů.V Příkaz Return (Visual Basic), zahrnout proměnnou místní pole bez závorek.
Určit pole jako parametr Sub nebo Function postupu, definujte parametr jako matice s zadaný datový typ a počet rozměrů.Při volání procedury odešlete proměnnou pole se stejným datovým typem a počet rozměrů.
V následujícím příkladu GetNumbers funkce vrátí Integer().Tento typ array je pole Typ jeden rozměrové Integer.ShowNumbers Přijímá postup Integer() argument.
Public Sub Process()
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)
Debug.WriteLine(numbers(index) & " ")
Next
End Sub
' Output:
' 10
' 20
' 30
V následujícím příkladu GetNumbersMultiDim funkce vrátí Integer(,).Tento typ array je dvou jednorozměrné pole typu Integer.ShowNumbersMultiDim Přijímá postup Integer(,) argument.
Public Sub ProcessMultidim()
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)
Debug.Write(numbers(index0, index1).ToString & " ")
Next
Debug.WriteLine("")
Next
End Sub
' Output
' 1 2
' 3 4
' 5 6
Vícenásobná pole
Pole obsahující jiné pole jako prvky se nazývá pole pole nebo pole nepravidelného.Pole nepravidelného a každý prvek pole nepravidelného může mít jednu nebo více dimenzí.Někdy je struktura dat v aplikaci dvourozměrná, ale nemá tvar obdélníku.
V následujícím příkladu je pole měsíců, je každý prvek pole dny.Protože různé měsíce mají rozdílný počet dní, nejsou prvky tvoří obdélníkové dvourozměrné pole.Proto pole nepravidelného se používá místo vícerozměrné pole.
' Declare the jagged array.
' The New clause sets the array variable to a 12-element
' array. Each element is an array of Double elements.
Dim sales()() As Double = New Double(11)() {}
' Set each element of the sales array to a Double
' array of the appropriate size.
For month As Integer = 0 To 11
Dim days As Integer =
DateTime.DaysInMonth(Year(Now), month + 1)
sales(month) = New Double(days - 1) {}
Next month
' Store values in each element.
For month As Integer = 0 To 11
Dim upper = sales(month).GetUpperBound(0)
For day = 0 To upper
sales(month)(day) = (month * 100) + day
Next
Next
Pole nulové délky
Matice, která neobsahuje žádné prvky se také nazývá pole nulové délky.Proměnná, která obsahuje pole nulové délky nemá hodnotu Nothing.Chcete-li vytvořit pole, které neobsahuje žádné prvky, deklarujte jeden rozměr pole jako hodnotu -1, jak ukazuje následující příklad.
Dim twoDimensionalStrings(-1, 3) As String
Budete muset vytvořit nulové délky pole za následujících okolností:
Bez rizika NullReferenceException výjimku, váš kód musí přístup k členům Array třídy, jako například Length nebo Rank, nebo zavolejte Visual Basic fungovat jako UBound.
Chcete-li zachovat náročné kódu jednodušší muset vyhledat Nothing jako zvláštní případ.
Váš kód spolupracuje s aplikační programovací rozhraní (API) je nutné předat pole nulové délky do jednoho nebo více postupů nebo vrátí nulové délky pole z jedné nebo více postupů.
Velikost pole
Velikost matice je součinu délky jeho rozměry.Představuje celkový počet prvků, které jsou aktuálně obsažené v poli.
Následující příklad deklaruje trojrozměrné.
Dim prices(3, 4, 5) As Long
Celková velikost pole v proměnné prices je (3 + 1) x (4 + 1) x (5 + 1) = 120.
Velikost matice můžete najít pomocí Length vlastnost.Délka každé dimenze vícerozměrné pole můžete vyhledat pomocí GetLength metoda.
Můžete změnit velikost proměnnou pole pomocí přiřazení nového objektu array k němu nebo ReDim prohlášení.
Mějte na mysli při obchodování s velikostí pole několika způsoby.
Délka dimenze |
Index každé dimenze je založen na 0, což znamená, že rozsah od 0 do její horní mez.Délka danou dimenzi tedy o 1 větší než deklarovaná horní mez pro tuto dimenzi. |
Omezení délky |
Délka každé dimenze matice je omezena na maximální hodnotu Integer datový typ, který je (2 ^ 31) - 1.Však celková velikost pole je také omezen paměti, které jsou k dispozici ve vašem systému.Při pokusu o inicializaci pole, který překračuje množství dostupné paměti RAM, společný jazykový modul runtime vyvolá OutOfMemoryException výjimku. |
Velikost a velikost elementu |
Velikost pole nezávisí na typu dat z jeho prvků.Velikost vždy představuje celkový počet prvků, nikoli počet bajtů, které mohou spotřebovat v úložišti. |
Spotřeba paměti |
Není to sice tak, aby všechny předpoklady týkající se jak matice je uložen v paměti.Úložiště se mění na platformách data různých šířek, tak stejné pole může spotřebovat více paměti na 64bitovou verzi systému než na 32-bit systému.V závislosti na konfiguraci systému při inicializaci pole, common language runtime (CLR) můžete přiřadit úložiště tak blízko u sebe co nejvíce pack prvky nebo zarovnat na fyzické hardwarové hranice.Také pole vyžaduje skladovací režie pro jeho řídicí informace a toto zatížení zvyšuje s každou přidanou dimenzi. |
Typy polí a dalších typů
Každé pole s typem dat, ale liší se od datového typu z jeho prvků.Neexistuje žádný jednotlivý typ dat pro všechna pole.Místo toho je datový typ pole určen počet rozměrů, nebo pořadí, pole a datový typ prvků v poli.Dvou proměnných jsou považovány za stejných dat zadejte pouze, pokud mají stejné pořadí a jejich prvky mají stejný datový typ..Délky dimenze v poli neovlivňují datový typ pole.
Každé pole dědí z System.Array třídy a můžete deklarovat proměnnou typu Array, ale nelze vytvořit pole typu Array.Navíc ReDim prohlášení (Visual Basic) nemůže pracovat proměnná definovaná jako typ Array.Z těchto důvodů a bezpečnost typů je vhodné deklarovat každé pole jako specifický typ, jako například Integer v předchozím příkladu.
Můžete zjistit typ dat pole nebo jeho prvků několika způsoby.
Můžete volat Object.GetType metoda na proměnnou doplňovat Type objekt pro proměnné typu run-time.Type Objekt obsahuje velké množství informací v jeho vlastnosti a metody.
Můžete předat proměnnou, která má TypeName funkce pro příjem String obsahující název typu run-time.
Můžete předat proměnnou, která má VarType funkce pro příjem VariantType hodnotu představující klasifikaci typu proměnné.
Následující příklad volá TypeName funkce k určení typu pole a typ prvků v poli.Typ pole je Integer(,) a prvků v poli jsou typu Integer.
Dim thisTwoDimArray(,) As Integer = New Integer(9, 9) {}
MsgBox("Type of thisTwoDimArray is " & TypeName(thisTwoDimArray))
MsgBox("Type of thisTwoDimArray(0, 0) is " & TypeName(thisTwoDimArray(0, 0)))
Kolekce jako alternativu k matice
Matice jsou zvláště užitečné pro vytváření a práci s pevným počtem silně typové objekty.Kolekce poskytují pružnější způsob práce se skupinami objektů.Na rozdíl od polí skupinu objektů, které pracují s zvětšit a zmenšit dynamicky se potřeb aplikace změnit.
Pokud potřebujete změnit velikost pole, je nutné použít ReDim prohlášení (Visual Basic).Když to uděláte, Visual Basic vytvoří nové pole a uvolní předchozí pole k dispozici.Zabere to čas spuštění.Proto v případě, že počet položek, které právě pracujete často mění, nebo nemůžete předpovědět, maximální počet položek, které potřebujete, je získat lepší výkon pomocí kolekce.
Zkratku pro některé kolekce můžete přiřadit k objektu, který vložíte do kolekce, takže můžete rychle obnovit objekt pomocí klíče.
Pokud vaše kolekce obsahuje prvky pouze jednoho typu dat, můžete použít jednu ze tříd v System.Collections.Generic oboru názvů.Obecné kolekce vynucuje typovou bezpečnost tak, že žádný jiný typ dat lze přidat k němu.Načítáte-li prvek z obecných kolekcí, není nutné zjistit jeho typ dat nebo ho převést.
Další informace o kolekcích naleznete v tématu Kolekce (C# a Visual Basic).
Příklad
Následující příklad používá .NET Framework obecná třída System.Collections.Generic.List<T> k vytvoření seznamu kolekce Customer objekty.
' Define the class for a customer.
Public Class Customer
Public Property Name As String
' Insert code for other members of customer structure.
End Class
' Create a module-level collection that can hold 200 elements.
Public CustomerList As New List(Of Customer)(200)
' Add a specified customer to the collection.
Private Sub AddNewCustomer(ByVal newCust As Customer)
' Insert code to perform validity check on newCust.
CustomerList.Add(newCust)
End Sub
' Display the list of customers in the Debug window.
Private Sub PrintCustomers()
For Each cust As Customer In CustomerList
Debug.WriteLine(cust)
Next cust
End Sub
Prohlášení o CustomerFile kolekce Určuje, zda může obsahovat pouze prvky typu Customer.Také poskytuje počáteční kapacita 200 prvků.Postup AddNewCustomer kontroluje platnost nový prvek a přidá jej do kolekce.Postup PrintCustomers používá For Each smyčka procházet kolekci a zobrazit její prvky.
Příbuzná témata
Termín |
Definice |
---|---|
Popisuje pořadí a rozměry v polích. |
|
Popisuje, jak naplnit pole počáteční hodnoty. |
|
Ukazuje, jak prvky pole seřadit podle abecedy. |
|
Popisuje pravidla a postup při přiřazení pole do jiné proměnné pole. |
|
Tento článek popisuje některé běžné problémy, které vznikají při práci s poli. |