9. diziler

9,1 giriş

PowerShell, her boyuttaki sıfır veya daha fazla öğeye sahip bir veya daha fazla boyutun dizilerini destekler. Bir boyut içinde öğeler, sıfırdan başlayan artan tamsayı sırasında numaralandırılır. Her bir öğeye dizi alt simge işleci [] (§ 7.1.4) aracılığıyla erişilebilir. Bir dizideki boyutların sayısına derecesi denir.

Bir öğesi, bir dizi türü dahil olmak üzere herhangi bir türde bir değer içerebilir. Değerleri herhangi bir dizi türünde olan bir veya daha fazla öğeye sahip bir dizi pürüzlü dizi olarak adlandırılır. Çok boyutlu bir dizide birden çok boyut bulunur, bu durumda bir boyutun her satırındaki öğelerin sayısı aynıdır. Pürüzlü bir dizinin bir öğesi çok boyutlu bir dizi içerebilir ve tam tersi de geçerlidir.

Çok boyutlu diziler satır birincil sırada depolanır. Bir dizideki öğelerin sayısı, dizi oluşturulduğunda düzeltilen dizinin uzunluğu olarak adlandırılır. Bu nedenle, 1 boyutlu bir dizide bulunan öğelerin uzunluğu N , ifadeler A[0], A[1], ..., A[N-1] kullanılarak erişilebilir (yani, alt indislenmiş). 2 boyutlu bir dizide bulunan ve M satırları bulunan, her satır N sütun içeren öğelere, ifadeler 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] kullanılarak erişilebilir. Üç veya daha fazla boyut içeren diziler için de.

Varsayılan olarak, bir dizi çok biçimli olur; Yani, öğeleri aynı türde olmalıdır. Örneğin,

$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

1 boyutlu bir dizide tür type[] vardır, 2 boyutlu type[,] bir dizide tür vardır, 3 boyutlu bir dizide type[,,] tür ve bu şekilde devam eder. burada tür , kısıtlanmış olmayan bir tür dizisi için nesne veya kısıtlanmış bir dizi için kısıtlanmış tür (§ 9,4).

Tüm dizi türleri tür dizisinden türetilir (§ 4.3.2).

9,2 dizisi oluşturma

Bir dizi, Şu formlara sahip bir dizi oluşturma ifadesi ile oluşturulur: birli virgül işleci (§ 7.2.1),dizi ifadesi (§ 7.1.7), ikili virgül işleci (§ 7,3), Range işleci (§ 7,4) veya New-Object cmdlet 'i.

Dizi oluşturma ve kullanım için bazı örnekler şunlardır:

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

Aşağıdaki işlem hattına yazılır:

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

10
False
red
10.50

Açıkça başlatılmamış herhangi bir öğenin varsayılan başlangıç değeri, bu öğenin türü için varsayılan değerdir ( $false Yani, sıfır veya $null ).

9,3 diziyi birleştirme

Rastgele tür ve uzunluğun dizileri, ve += işleçleri ile + birleştirilebilir, her ikisi de yeni bir kısıtlanmış olmayan 1 boyutlu dizi oluşturulmasına neden olur. Varolan diziler değiştirilmez. Daha fazla bilgi için bkz. § 7.7.3 ve kısıtlanmış tür dizisine ekleme hakkında bir tartışma için § 9,4 .

9,4 kısıtlayan öğe türleri

Bir dizi türü cast ile dizi oluşturma ifadesine önek ekleyerek tür sınırlamalı olması için 1 boyutlu bir dizi oluşturulabilir. Örneğin,

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

Çok boyutlu bir dizi oluşturmak için sözdizimi bir türün belirtimini gerektirir ve bu tür bu dizi için kısıtlama türü olur. Ancak, tür object[] belirterek gerçekten hiçbir tür değeri bu türdeki bir dizinin bir öğesine atanabilir.

İki diziyi (§ 7.7.3) birleştirerek her zaman, her iki dizi de aynı türde kısıtlanmış olsa bile, kısıtlanmış olmayan yeni bir dizi oluşur. Örneğin,

$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

başvuru türü olarak 9,5 dizileri

Dizi türleri başvuru türlerdir, bir diziyi belirlemek bir dizi sıralama, uzunluk ve öğe türünün herhangi bir dizisine başvuracak şekilde yapılabilir. Örneğin,

$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

Bir dizinin atanması basit bir kopyalama içerir; diğer bir deyişle, atanan değişkeni aynı diziyi ifade eder, dizinin bir kopyası yapılmaz. Örneğin,

$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

Aşağıdaki işlem hattına yazılır:

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

dizi öğeleri olarak 9,6 dizileri

Bir dizinin herhangi bir öğesi, bir dizi olabilir. Örneğin,

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

Aşağıdaki işlem hattına yazılır:

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

$list[1] gösterildiği gibi, üzerinden $list[1][0] erişilen 1 öğeli bir Array öğesine başvurur. Bunu aşağıdaki güvenle farklı bir durum ile karşılaştırın:

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

$list[1]Burada, ile $list[1] erişilen, bir skaler ve tamsayı anlamına gelir.

Aşağıdaki örneği göz önünde bulundurun

$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 negatif alt simge

Bu, § 7.1.4.1içinde ele alınmıştır.

9,8 sınır denetimi

Bu, § 7.1.4.1içinde ele alınmıştır.

9,9 dizi dilimleri

Dizi dilimi , öğeleri bir koleksiyondan sıfır veya daha fazla öğenin kopyası olan kısıtlanmamış bir 1 boyutlu dizidir. Bir dizi dilimi, alt simge işleci [] (§ 7.1.4.5) ile oluşturulur.

9,10 bir diziyi kopyalama

Ardışık bir öğe kümesi, yöntemi [Array]::Copy kullanılarak bir diziden diğerine kopyalanabilir. Örneğin,

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

dizi üzerinde numaralandırma 9,11

Alt simge işleci aracılığıyla öğelerinin her birine erişen bir dizi aracılığıyla döngü uygulamak mümkün olsa da, Foreach ifadesini kullanarak bu dizinin öğelerinin üzerinde listeleme yapabiliriz. Çok boyutlu bir dizi için öğeler satır birincil sırada işlenir. Örneğin,

$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 çok boyutlu dizi düzleştirme

Çok boyutlu bir dizideki bazı işlemler (örneğin, çoğaltma (§ 7.6.3) ve birleştirme (§ 7.7.3)), bu dizinin düzleştirilmesi gerektirir; diğer bir deyişle, kısıtlanmış olmayan bir türdeki 1 boyutlu bir diziye açılması için. Sonuçta elde edilen dizi tüm öğeleri satır-birincil sırada alır.

Aşağıdaki örneği inceleyin:

$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

Tarafından $c belirlenen dizi, "Red", $true , 10, 20, 30 ve 40 öğelerini içerir.