9. Tablice

9.1 Wprowadzenie

Program PowerShell obsługuje tablice o co najmniej jednym wymiarze, w których każdy wymiar ma zero lub więcej elementów. W wymiarze elementy są numerowane w kolejności rosnącej liczby całkowitej, zaczynając od zera. Dostęp do każdego pojedynczego elementu można uzyskać za pośrednictwem operatora indeksu dolnego tablicy [] (";7.1.4). Liczba wymiarów w tablicy jest nazywana jej rangą.

Element może zawierać wartość dowolnego typu, w tym typ tablicy. Tablica mająca co najmniej jeden element, którego wartości są dowolnego typu tablicy, jest nazywana tablicą oflagowana. Tablica wielowymiarowa ma wiele wymiarów. W takim przypadku liczba elementów w każdym wierszu wymiaru jest taka sama. Element tablicy oflagowanej może zawierać tablicę wielowymiarową i na odwrót.

Tablice wielowymiarowe są przechowywane w kolejności głównych wierszy. Liczba elementów w tablicy jest nazywana długością tej tablicy , która jest stała podczas tworzenia tablicy. W związku z tym elementy tablicy 1-wymiarowej A o długości N są dostępne (tj. z indeksem dolnym) przy użyciu wyrażeń .A[0], A[1], ..., A[N-1] Elementy w 2-wymiarowej tablicy B z wierszami M , z których każdy wiersz ma N kolumn, są dostępne przy użyciu wyrażeń B[0,0], B[0,1], ..., B[0,N-1], B[1,0], B[1,1], ..., B[1,N-1], ..., B[M-1,0], B[M-1,1], ..., B[M-1,N-1]. I tak dalej w przypadku tablic z co najmniej trzema wymiarami.

Domyślnie tablica jest polimorficzna; Tzn. jego elementy nie muszą mieć tego samego typu. Na przykład

$items = 10,"blue",12.54e3,16.30D # 1-D array of length 4
$items[1] = -2.345
$items[2] = "green"

$a = New-Object 'object[,]' 2,2 # 2-D array of length 4
$a[0,0] = 10
$a[0,1] = $false
$a[1,0] = "red"
$a[1,1] = $null

Tablica 1-wymiarowa ma typ , tablica 2-wymiarowa type[,]ma typ , tablica 3-wymiarowa type[]``type[,,]ma typ itd., gdzie typ jest obiektem dla nieprzetrenowanej tablicy typów lub typ ograniczony dla tablicy ograniczonej (";9.4).

Wszystkie typy tablic pochodzą od typu Tablica (";4.3.2).

9.2 Tworzenie tablicy

Tablica jest tworzona za pośrednictwem wyrażenia tworzenia tablicy , które ma następujące formy: operator przecinka dwuargowego ();7.2.1) , wyrażenie-tablicy ();7.1.7), operator przecinka binarnego (plik binarny,7,3), operator zakresu (wersja 7.4) lub polecenie cmdlet New-Object .

Oto kilka przykładów tworzenia i używania tablicy:

$values = 10, 20, 30
for ($i = 0; $i -lt $values.Length; ++$i) {
    "`$values[$i] = $($values[$i])"
}

$x = , 10                         # x refers to an array of length 1
$x = @(10)                        # x refers to an array of length 1
$x = @()                          # x refers to an array of length 0

$a = New-Object 'object[,]' 2, 2  # create a 2x2 array of anything
$a[0, 0] = 10                     # set to an int value
$a[0, 1] = $false                 # set to a boolean value
$a[1, 0] = "red"                  # set to a string value
$a[1, 1] = 10.50D                 # set to a decimal value
foreach ($e in $a) {              # enumerate over the whole array
    $e
}

W potoku są zapisywane następujące elementy:

$values[0] = 10
$values[1] = 20
$values[2] = 30

10
False
red
10.50

Domyślna wartość początkowa dowolnego elementu, który nie został jawnie zainicjowany, jest wartością domyślną typu tego elementu (czyli , $falsezero lub $null).

9.3. Konkasowanie tablic

Tablice dowolnego + typu i długości można owijać za pośrednictwem operatorów i += . Oba te typy mogą powodować utworzenie nowej, niewytrenowanej tablicy jednowymiarowej. Istniejące tablice są niezmienione. Aby uzyskać więcej informacji, zobacz . 7.7.3 i .9.4 , aby uzyskać omówienie dodawania do tablicy typu ograniczonego.

9.4. Ograniczanie typów elementów

Tablicę 1-wymiarową można utworzyć tak, aby ograniczała typ, poprzedzając wyrażenie tworzenia tablicy prefiksem rzutowania typu tablicy. Na przykład

$a = [int[]](1,2,3,4)   # constrained to int
$a[1] = "abc"           # implementation-defined behavior
$a += 1.23              # new array is unconstrained

Składnia tworzenia tablicy wielowymiarowej wymaga specyfikacji typu i ten typ staje się typem ograniczenia dla tej tablicy. Jednak określając typ object[], tak naprawdę nie ma żadnego ograniczenia, ponieważ wartość dowolnego typu może być przypisana do elementu tablicy tego typu.

Concatenating two arrays ([7.7.3) always results in a new array that is unconstrained even if both arrays are constrained by the same type (Łączy dwie tablice [7.7.3]) zawsze skutkuje nową tablicą, która jest nieprzygotowana, nawet jeśli obie tablice są ograniczone przez ten sam typ. Na przykład

$a = [int[]](1,2,3)    # constrained to int
$b = [int[]](10,20)    # constrained to int
$c = $a + $b           # constraint not preserved
$c = [int[]]($a + $b)  # result explicitly constrained to int

9.5 Tablice jako typy referencyjne

Ponieważ typy tablic są typami referencyjnymi, zmienna wyznaczaca tablicę może odwoływać się do dowolnej tablicy dowolnego typu rangi, długości i elementu. Na przykład

$a = 10,20                     # $a refers to an array of length 2
$a = 10,20,30                  # $a refers to a different array, of length 3
$a = "red",10.6                # $a refers to a different array, of length 2
$a = New-Object 'int[,]' 2,3   # $a refers to an array of rank 2

Przypisanie tablicy obejmuje pobiebienia kopię; oznacza to, że zmienna przypisana do funkcji odwołuje się do tej samej tablicy, nie jest dzielona żadna kopia tablicy. Na przykład

$a = 10,20,30
">$a<"
$b = $a         # make $b refer to the same array as $a
">$b<"

$a[0] = 6       # change value of [0] via $a
">$a<"
">$b<"          # change is reflected in $b

$b += 40        # make $b refer to a new array
$a[0] = 8       # change value of [0] via $a
">$a<"
">$b<"          # change is not reflected in $b

W potoku są zapisywane następujące elementy:

>10 20 30<
>10 20 30<
>6 20 30<
>6 20 30<
>8 20 30<
>6 20 30 40<

9.6 Tablice jako elementy tablicy

Każdy element tablicy może być tablicą. Na przykład

$colors = "red", "blue", "green"
$list = $colors, (,7), (1.2, "yes") # parens in (,7) are redundant; they
                                    # are intended to aid readability
"`$list refers to an array of length $($list.Length)"
">$($list[1][0])<"
">$($list[2][1])<"

W potoku są zapisywane następujące elementy:

$list refers to an array of length 3
>7<
>yes<

$list[1] Odnosi się do tablicy 1 elementu, liczby całkowitej 7, do której uzyskuje się dostęp za pośrednictwem $list[1][0], jak pokazano. Porównaj to z następującymi, nieco różniącymi się literami przypadków:

$list = $colors, 7, (1.2, "yes") # 7 has no prefix comma
">$($list[1])<"

W tym $list[1] przypadku odnosi się do wartości skalarnych, czyli liczby całkowitej 7, do której dostęp jest uzyskiwany za pośrednictwem funkcji $list[1].

Rozważmy następujący przykład:

$x = [string[]]("red","green")
$y = 12.5, $true, "blue"
$a = New-Object 'object[,]' 2,2
$a[0,0] = $x               # element is an array of 2 strings
$a[0,1] = 20               # element is an int
$a[1,0] = $y               # element is an array of 3 objects
$a[1,1] = [int[]](92,93)   # element is an array of 2 ints

9.7 Ujemny indeks dolny

Omówiono to w programie .7.1.4.1.

9.8 Sprawdzanie granic

Omówiono to w programie .7.1.4.1.

9.9 Wycinki tablic

Wycinek tablicy to nieprzetrenowana tablica 1-wymiarowa, której elementy są kopiami zera lub większej liczby elementów z kolekcji. Wycinek tablicy jest tworzony za pomocą operatora indeksu dolnego [] (";7.1.4.5).

9.10 Kopiowanie tablicy

Ciągły zestaw elementów można skopiować z jednej tablicy do innej przy użyciu metody [Array]::Copy. Na przykład

$a = [int[]](10,20,30)
$b = [int[]](0,1,2,3,4,5)
[Array]::Copy($a, $b, 2)        # $a[0]->$b[0],
$a[1]->$b[1]
[Array]::Copy($a, 1, $b, 3, 2)  # $a[1]->$b[3],
$a[2]->$b[4]

9.11 Wyliczanie tablicy

Mimo że istnieje możliwość zapętlić tablicy, która uzyskuje dostęp do każdego z jej elementów za pośrednictwem operatora indeksu dolnego, możemy wyliczyć elementy tej tablicy przy użyciu instrukcji foreach. W przypadku tablicy wielowymiarowej elementy są przetwarzane w kolejności głównych wierszy. Na przykład

$a = 10, 53, 16, -43
foreach ($elem in $a) {
    # do something with element via $e
}

foreach ($elem in -5..5) {
    # do something with element via $e
}

$a = New-Object 'int[,]' 3, 2
foreach ($elem in $a) {
    # do something with element via $e
}

9.12 Spłaszczanie tablic wielowymiarowych

Niektóre operacje na tablicy wielowymiarowej (takie jak replikacja (";7.6.3) i ujednoznaczanie (";7.7.3)) wymagają spłaszczenia tej tablicy; oznacza to, że ma zostać przekształcona w 1-wymiarową tablicę nieprzetrennego typu. Wynikowa tablica przyjmuje wszystkie elementy w kolejności głównych wierszy.

Rozpatrzmy następujący przykład:

$a = "red",$true
$b = (New-Object 'int[,]' 2,2)
$b[0,0] = 10
$b[0,1] = 20
$b[1,0] = 30
$b[1,1] = 40
$c = $a + $b

Tablica wyznaczona przez element $c zawiera elementy "red", $true, 10, 20, 30 i 40.