代码之家  ›  专栏  ›  技术社区  ›  Paul Williams

迭代数组时输出有问题

  •  1
  • Paul Williams  · 技术社区  · 6 月前

    我正在Powershell中构建一个数组数组,目标是迭代该数组并从每个成员元素输出字符串。然而,在这样做的过程中,我得到了一些没有意义的片段。

    代码的开头是这样的:

    $details = @()
    
    $row = @(6.00, "First", "Normal", 20, "")
    $details += $row
    
    $row = @(12.00, "First", "Normal", 12, "")
    $details += $row
    

    然后逐一迭代 $row 使用a foreach 循环如下:

    foreach ($item in $details) {
        $price = $item[0]
        $edition = $item[1]
        $printing = $item[2]
        $stock = $item[3]
        $modifier = $item[4]
        $string = i
    
        $debug = "Added data for : $edition / $print  ..."
    }
    

    但输出 $debug 我明白了

    Added data for: i / r ...
    Added data for: i / r ...
    

    它应该输出:

    First / Normal
    
    1 回复  |  直到 6 月前
        1
  •  1
  •   mklement0    6 月前

    PowerShell的多态 + operator ,当应用于 阵列 ,执行 平的 数组拼接。
    也就是说,如果RHS也是一个数组, 其要素 “附加”到LHS阵列,而不是RHS阵列 作为一个整体 ,作为一个单一的元素。

    因此,

    $row = @(6.00, "First", "Normal", 20, "")
    $details += $row
    

    “附加” 1. 存储在中的数组 $row 作为一个 单一元素 $details 数组,但附加 $行 s 元素 ,一个接一个。

    • 一个简单的演示:

       $array = @('foo')
       $array += @('bar', 'baz')
       # -> @('foo', 'bar', 'baz')
      

    使用一元形式 , 这个 array constructor ("comma") operator 为了将数组添加为 单一的 元素到给定数组,即作为 嵌套 数组:

    $details = @()
    $row = @(6.00, "First", "Normal", 20, "")
    $details += , $row
    
    $details[0][0] # -> 6.00
    

    [1] 从技术上讲,因为。NET数组是 固定尺寸 数据结构,你可以 附加到它们(更改它们的大小)。什么 + PowerShell中的操作是创建 幕后阵列,包括LHS元素和RHS元素。
    还要注意,这意味着使用 += 在一个 具有 多次迭代 因此最好避免,以避免性能问题;看见 this answer 了解详情。