【问题标题】:How to initialize a large, multi-dimensional array in Powershell?如何在 Powershell 中初始化一个大型的多维数组?
【发布时间】:2021-12-05 07:09:08
【问题描述】:

关于这个话题,到目前为止,我在这里发现了两个与我的问题相关的问题,但并不完全。我找到了如何初始化一个大数组here。另外,我发现了如何声明一个多维数组here。我还没有找到涵盖如何声明和初始化多维数组的解决方案。就我而言,我需要一个数组[10][10],所有元素都初始化为零。目前我这样做如下:

$array = @(
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
)

当然,这是完全不可扩展的。从第一个问题开始,我发现$arr = @(0) * 10000 适用于常规数组,所以我尝试使用$array = @(@(0) * 10) * 10,虽然它运行得很好,但尝试访问该数组的任何元素都会给我一个“无法修改,因为元素为空” ' 错误。

为了澄清,这段代码:

$array = @(
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
)
Write-Host "$($null -eq $array[1][5])"

返回 False,代码如下:

$array = @(@(0) * 10) * 10
Write-Host "$($null -eq $array[1][5])"

返回 True。

声明和初始化 N 维数组的明确、正确、可扩展的方法是什么?

【问题讨论】:

标签: arrays powershell


【解决方案1】:

声明和初始化 N 维数组的明确、正确、可扩展的方法是什么?

$2DArray = [int[,]]::new(10,10)

这将创建一个 10x10 二维数组,您可以像这样对其进行索引:

$null -ne $2DArray[1,5]

对于交错的数组(数组的数组),使用一元数组运算符,

$jaggedArray = ,((0) * 10) * 10 

这将创建一个 10 项数组,其中包含 0 的 10 个 10 项数组,您可以像这样对其进行索引:

$null -ne $jaggedArray[1][5]

正如 cmets 中所述,由于 PowerShell 倾向于扁平化任何数组,因此最好设计一个自定义数据类型来收集特定信息:

using namespace System.Collections.Generic

class SensorSink {
  [List[int[]]]$Measurements = [List[int[]]]::new(10)

  AcceptTelemetry([int[]]$telemetry){
    if($telemetry.Count -ne 10){
      throw [ArgumentException]::new('telemetry', "Expected exactly 10 data points, received $($telemetry.Count)")
    }

    $this.Measurements.Add($telemetry)
  }
}

【讨论】:

  • 对于像我这样的 Powershell 新手来说,这一切都令人难以置信。在常规和锯齿状数组、哈希表之间,,@()。也就是说,您的解决方案非常有效。你真的是 Powershell 大师。
  • @martorad FWIW 你几乎从不需要这样的嵌套数组。有可能是您要解决的任何问题,您最好使用描述“内部”数组值的对象数组(自定义或基于class 定义)。但是,如果您在这个方向上有什么建议,您必须告诉我们您实际尝试使用 10x10 阵列实现的目标:)
  • 我从微控制器上的 10 个传感器获得 10 个值。然后我通过 Serial 接收这些值并将它们读入我的 Powershell 脚本。我收到这些值 10 次,因此我的维度是 10x10。事实上,100 个元素的常规数组在这里就足够了,我决定将其设为 2D 纯粹是因为它看起来更好
  • 最终更新,我首先实现了 jaggedArray 解决方案,该解决方案有效,但由于我将所有数据转换为 JSON,它将其展平为 1 个包含 100 个元素的数组。然后我实现了字符串数组列表解决方案,它就像一个魅力。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-20
  • 2011-01-24
相关资源
最近更新 更多