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 , $false
zero 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.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla