9. Pole

9.1 Úvod

PowerShell podporuje pole jedné nebo více dimenzí s každou dimenzí, která má nula nebo více prvků. V rámci dimenze jsou prvky očíslovány ve vzestupném celočíselném pořadí počínaje nulou. K libovolnému jednotlivému prvku je možné přistupovat prostřednictvím operátoru dolního indexu pole [] (%)7.1.4). Počet dimenzí v poli se nazývá jeho pořadí.

Element může obsahovat hodnotu libovolného typu, včetně typu pole. Pole s jedním nebo více prvky, jejichž hodnoty jsou libovolného typu pole, se nazývá více než jedno pole. Multidimenzionální pole má více dimenzí. V takovém případě je počet prvků v každém řádku dimenze stejný. Prvek vícenásobné pole může obsahovat vícedimenzionální pole a naopak.

Vícedimenzionální pole se ukládají v pořadí podle velkého řádku. Počet prvků v poli se nazývá délka tohoto pole, která je pevná při vytvoření pole. Prvky v jednorozměrném poli A s délkou N jsou tak přístupné (tj. dolní indexované) pomocí výrazů A[0], A[1], ..., A[N-1]. K prvkům ve dvourozměrném poli B s řádky M, z nichž každý má N sloupců, je možné získat přístup pomocí výrazů 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]. A tak dále pro pole se třemi nebo více dimenzemi.

Ve výchozím nastavení je pole polymorfní. Tj. jeho prvky nemusí mít všechny stejný typ. Třeba

$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

type[]Jednorozměrné pole má typ , 2rozměrné type[,]pole má typ , trojrozměrné type[,,]pole má typ atd., kde type je objekt pro pole typu bez omezení nebo omezený typ pro omezené pole (9,4).

Všechny typy polí jsou odvozeny z typu Pole (%)4.3.2).

9.2 Vytvoření pole

Pole se vytvoří pomocí výrazu pro vytvoření pole, který má následující tvary: unární operátor čárky (%7.2.1), array-expression (\7.1.7), binární operátor čárky (%7.3), operátor rozsahu (\7.4) nebo rutina New-Object .

Tady je několik příkladů vytvoření a použití pole:

$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
}

Do kanálu se zapisou následující položky:

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

10
False
red
10.50

Výchozí počáteční hodnota jakéhokoli prvku, který není explicitně inicializován, je výchozí hodnotou pro typ tohoto prvku (to znamená , $falsenula nebo $null).

9.3 Zřetězení polí

Pole libovolného + += typu a délky je možné zřetěgrovat pomocí operátorů a , z nichž oba mají za následek vytvoření nového jednorozměrného pole bez omezení. Existující pole se nemění. Další informace najdete v části 7.7.3 a část 9.4 , ve které najdete diskuzi o přidání do pole omezeného typu.

9.4 Typy elementů s omezením

Jednorozměrné pole lze vytvořit tak, aby bylo typově omezené, a to tak, že před výraz vytvoření pole předtyp pole přetypuje. Třeba

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

Syntaxe pro vytvoření multidimenzionálního pole vyžaduje specifikaci typu a tento typ se stane typem omezení pro toto pole. Když ale zadáte typ object[], ve skutečnosti neexistuje žádné omezení, protože hodnotu libovolného typu lze přiřadit k prvku pole tohoto typu.

Zřetězování dvou polí (7.7.3) vždy vede k novému poli, které není omezené, i když jsou obě pole omezena stejným typem. Třeba

$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 Pole jako odkazové typy

Vzhledem k toho, že typy polí jsou odkazové typy, může proměnná označující pole odkazovat na libovolné pole libovolného typu pořadí, délky a elementu. Třeba

$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

Přiřazení pole zahrnuje kopii bez podmět; To znamená, že proměnná přiřazená odkazuje na stejné pole, není provedena žádná kopie pole. Třeba

$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

Do kanálu se zapisou následující položky:

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

9.6 Pole jako prvky pole

Libovolný prvek pole může být sám o sobě polem. Třeba

$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])<"

Do kanálu se zapisou následující položky:

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

$list[1] odkazuje na pole s 1 prvkem, celočíselnou hodnotou 7, ke které se přistupuje prostřednictvím $list[1][0], jak je znázorněno na obrázku. Porovnejte to s následujícími malými různými případy:

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

Tady odkazuje $list[1] na skalár, celé číslo 7, ke kterému se přistupuje prostřednictvím $list[1].

Vezměte v úvahu následující příklad:

$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 Negativní dolní index

To je popsáno v 7.1.4.1.

9.8 Kontrola meze

To je popsáno v 7.1.4.1.

9.9. Řezy pole

Řez pole je jednorozměrné pole bez omezení, jehož prvky jsou kopiemi nula nebo více prvků z kolekce. Řez pole se vytvoří pomocí operátoru dolního indexu [] (%)7.1.4.5).

9.10 Kopírování pole

Souvislé sady prvků lze zkopírovat z jednoho pole do jiného pomocí metody [Array]::Copy. Třeba

$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 Vytváření výčtu v poli

I když je možné projít polem, které přistupuje ke každému z jeho prvků prostřednictvím operátoru dolního indexu, můžeme vytvořit výčet prvků tohoto pole pomocí příkazu foreach. U multidimenzionálního pole jsou prvky zpracovány v pořadí podle velkého řádku. Třeba

$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 Zploštění vícedimenzionálních polí

Některé operace s multidimenzionálním polem (například replikace (7.6.3) a zřetězení (7.7.3)) vyžadují, aby toto pole bylo zploštěné. To znamená, že se má přetápnout na jednorozměrné pole typu bez omezení. Výsledné pole přebírá všechny prvky v pořadí podle velkého řádku.

Uvažujte následující příklad:

$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

Pole určené obsahuje $c prvky "red", $true, 10, 20, 30 a 40.