当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 数组

作者:精品下载站 日期:2024-12-14 02:55:54 浏览:13 分类:玩电脑

数组


9.1 简介

PowerShell 支持一维或多维数组,每个维度具有零个或多个元素。在维度内,元素从零开始按升序整数顺序编号。任何单个元素都可以通过数组下标运算符 [] 访问(第 7.1.4 节)。数组中的维数称为其

元素可以包含任何类型的值,包括数组类型。具有一个或多个值为任意数组类型的元素的数组称为交错数组多维数组具有多个维度,在这种情况下,一个维度的每一行中的元素数量是相同的。锯齿状数组的元素可以包含多维数组,反之亦然。

多维数组按行优先顺序存储。数组中元素的数量称为该数组的长度,它在创建数组时是固定的。因此,可以使用表达式 访问长度为 N 的一维数组 A 中的元素(即下标) A[0],A[1],...,A[N-1]。二维数组 B 中的元素具有 M 行,每行具有 N 列,可以使用表达式 进行访问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]。对于具有三个或更多维度的数组,依此类推。

默认情况下,数组是多态的;即,它的元素不需要全部具有相同的类型。例如,

$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[],二维数组的类型为 type[,],3 维数组的类型为 type[, ,] 等,其中 type 是无约束类型数组的对象,或受约束数组的受约束类型(第 9.4 节)。

所有数组类型均派生自 Array 类型(第 4.3.2 节)。

9.2 数组创建

数组是通过数组创建表达式创建的,该表达式具有以下形式:一元逗号运算符 (第 7.2.1 节)、数组表达式 (第 7.1.7 节)、二元逗号运算符(第 7.3 节)、范围运算符(第 7.4 节)或 New-Object cmdlet。

以下是数组创建和使用的一些示例:

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

以下内容写入管道:

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

10
False
red
10.50

任何未显式初始化的元素的默认初始值都是该元素类型的默认值(即 $false、零或 $null)。

9.3 数组串联

任意类型和长度的数组可以通过 + 和 += 运算符连接,这两个运算符都会创建一个新的无约束一维数组。现有数组不变。有关更多信息,请参阅第 7.7.3 节;有关添加到受约束类型数组的讨论,请参阅第 9.4 节。

9.4 约束元素类型

可以通过在数组创建表达式前添加数组类型转换来创建一维数组,使其受到类型约束。例如,

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

创建多维数组的语法需要指定类型,并且该类型将成为该数组的约束类型。然而,通过指定类型object[],实际上没有任何限制,因为任何类型的值都可以分配给该类型数组的元素。

连接两个数组(第 7.7.3 节)始终会产生一个不受约束的新数组,即使两个数组都受相同类型的约束也是如此。例如,

$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 数组作为引用类型

由于数组类型是引用类型,因此可以使指定数组的变量来引用任何等级、长度和元素类型的任何数组。例如,

$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

数组的赋值涉及到浅拷贝;也就是说,分配给的变量引用同一个数组,不复制该数组。例如,

$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

以下内容写入管道:

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

9.6 数组作为数组元素

数组的任何元素本身都可以是数组。例如,

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

以下内容写入管道:

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

$list[1] 指的是一个包含 1 个元素的数组,即整数 7,可通过 $list[1][0] 访问,如图所示。将此与以下略有不同的情况进行比较:

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

这里,$list[1] 指的是一个标量,即整数 7,可通过 $list[1] 访问。

考虑下面的例子,

$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 负下标

这将在第 7.1.4.1 节中讨论。

9.8 边界检查

这将在第 7.1.4.1 节中讨论。

9.9 数组切片

数组切片是一个不受约束的一维数组,其元素是集合中零个或多个元素的副本。数组切片是通过下标运算符 [] 创建的(第 7.1.4.5 节)。

9.10 复制数组

可以使用[Array]::Copy 方法将一组连续的元素从一个数组复制到另一个数组。例如,

$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 枚举数组

虽然可以通过下标运算符循环访问数组的每个元素,但我们可以使用 foreach 语句枚举该数组的元素。对于多维数组,元素按行优先顺序处理。例如,

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

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

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

9.12 多维数组展平

多维数组上的某些操作(例如复制(第 7.6.3 节)和串联(第 7.7.3 节))要求该数组展平;即转换为无约束类型的一维数组。生成的数组按行优先顺序呈现所有元素。

考虑以下示例:

$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

$c 指定的数组包含元素“red”、$true、10、20、30 和 40。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯