【问题标题】:How can I initialize an array of arrays (multidimensional) in PowerShell 5.0如何在 PowerShell 5.0 中初始化数组数组(多维)
【发布时间】:2017-02-02 02:40:00
【问题描述】:

我正在尝试使用 PowerShell (5.0) 划分工作块,并且很难实例化多维数组。

$n = 456;
$MaxChunks = 6;

$Chunks = @();

for($x = 0; $x -lt $MaxChunks; $x++)
{    
    Write-Host "Creating chunk $x"    
    $Chunks += @();
}

$Chunks.Count 始终返回 0,我无法按索引访问 $Chunks 中的任何内容(即 $Chunks[0] 为空)。

最终,我的目标是访问位于$Chunks[$i] 的数组并向其中添加多个System.Data.DataRow 对象。但是,正如我所说,我无法访问该索引处的数组,因为该数组从未实例化。

我已经阅读了thisthis,但我不太能够将哈希表场景转换为我的情况。

【问题讨论】:

  • 您在第二个链接中看到this answer 了吗?这可能就是您需要的信息。
  • $Chunks = ,@() * $MaxChunks
  • @PetSerAl,它将重用相同的对象实例。虽然如果 OP 使用 += 填充这些子数组,这不会有问题,因为 += 重新创建了数组。
  • @wOxxOm 零长度数组实际上是只读的,所以(除了引用相等)它是否重用并不重要。
  • This question 可能会有答案。

标签: arrays powershell multidimensional-array


【解决方案1】:

或者:

[System.Array] $chunks = [System.Array]::CreateInstance( [Int32], 3, 3 );

$chunks[0,0];
0

不是原生 PS,但可以。

【讨论】:

    【解决方案2】:
    • 复制一个空数组。
      每个元素都引用了相同的对象,但在这种特殊情况下,这不是问题,因为标准数组是只读的,并且在通过 += 添加元素时会重新创建。

      $Chunks = ,@() * $MaxChunks
      
    • 收集foreach的输出:

      $Chunks = @(foreach ($x in 1..$MaxChunks) { ,@() })
      

      当 $MaxChunks = 1 时,外部 @() 处理理论上可能的情况。
      您可以使用更详细(可能更慢)的 Write-Output -NoEnumerate:

      $Chunks = @(foreach ($x in 1..$MaxChunks) { echo -NoEnumerate @() })
      
    • 如果子数组会被大量修改,请使用ArrayList而不是+=

      $Chunks = @(foreach ($x in 1..$MaxChunks) { ,[Collections.ArrayList]@() })
      

      及以后:

      $Chunks[0].Add($something) >$null
      

    附:不要使用+=从头开始生成整个数组,无论它的大小如何,因为它是一种每次都重新创建和复制整个数组的糟糕方法;通过循环语句(例如 foreach、for、while)可以更快、更简单地收集输出; ArrayList 对象用于数组频繁非顺序修改的情况。

    【讨论】:

    • 顺便说一句,你为什么用echo -NoEnumerate而不是,
    • 主要是因为它更冗长,因此错字/忽略的机会更少。此外,在内部 ,@() 创建了两个数组,外部的一个展开(虽然开销可以忽略不计,所以我想我会在答案中添加它)。
    • 另外,,@() 在内部创建了两个数组 这同样适用于echo -NoEnumerate @()。而且它还有实例化Write-Output cmdlet、参数绑定等的开销。
    • 听起来很有说服力。
    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 2021-12-05
    • 2010-11-07
    • 1970-01-01
    相关资源
    最近更新 更多