【问题标题】:Creating dynamic variable array names and then adding object to them创建动态变量数组名称,然后向其中添加对象
【发布时间】:2014-02-21 16:43:45
【问题描述】:

我要做的是动态创建数组变量名称,然后使用循环,根据哈希表值等于计数器变量,将对象添加到其相关数组中。

$hshSite = @{}  # Values like this  CO,1  NE,2  IA,3

$counter = $hshSite.count

For($i = $counter; $i -gt 0; $i--) {
New-Variable -Name "arr$i" -Value @()
}

如果 $counter = 3,我将创建数组 $arr1、$arr2、$arr3

$csv = Import-CSV....

ForEach ($x in $csv) {
   #if $hshSite.Name = $x.location (ie CO), look up hash value (1),
   and add the object to $arr1.  If $hshSite.Name = NE, add to $arr2

我尝试使用 New-Variable 创建动态数组,但尝试添加到这些数组时遇到问题。是否可以将 2 个变量名称连接成一个变量名称?所以用 $arr + $i 形成 $arr1 和 $arr2 和 $arr3,然后我基本上可以只做 $arr0 += $_

最终目标是根据 CO、NE、IA 对事物进行分组,以便进一步分类/分组/处理。我对实现这一目标的其他想法持开放态度。感谢您的帮助!

【问题讨论】:

    标签: powershell dynamic-arrays


    【解决方案1】:

    只需将您的哈希表值设置为数组,然后将值直接累积到它们:

    $Sites = 'CO','NE','IA'
    $hshSite = @{}
    Foreach ($Site in $Sites){$hshSite[$Site] = @()}
    
    ForEach ($x in $csv)
     {
       $hshSite[$x.location] += <whatever it is your adding>
     } 
    

    如果 csv 中有很多条目,您可以考虑将这些值创建为数组列表而不是数组。

    $Sites = 'CO','NE','IA'
    $hshSite = @{}
    Foreach ($Site in $Sites){ $hshSite[$Site] = New-Object Collections.Arraylist }
    
    ForEach ($x in $csv)
     {
       $hshSite[$x.location].add('<whatever it is your adding>') > $nul
     } 
    

    【讨论】:

    • 太棒了!是的,CSV 确实有很多记录。你能简要解释一下使用数组列表而不是数组的好处吗?再次感谢您的帮助!!!
    • 这是一个与内部如何处理数组有关的性能问题。您不能真正添加​​到数组中。 += 操作所做的是创建一个全新的数组,该数组由原始数组的元素加上新元素组成。这会产生大量的进程开销。数组列表不这样做,因此每次操作要快几毫秒。只要它只有几个条目,性能差异就是微不足道的,不值得放弃数组方法提供的更简单更直观的编码。当你开始做很多事情时,差异就会变得很大。
    【解决方案2】:

    您可以很容易地使用 Get-Variable cmdlet 将项目添加到动态命名的数组变量中。类似于以下内容:

    $MyArrayVariable123 = @()
    $VariableNamePrefix = "MyArrayVariable"
    $VariableNameNumber = "123"
    
    $DynamicallyRetrievedVariable = Get-Variable -Name ($VariableNamePrefix + $VariableNameNumber)
    $DynamicallyRetrievedVariable.Value += "added item"
    

    运行上述代码后,$MyArrayVariable123 变量将是一个包含单个字符串 added item 的数组。

    【讨论】:

      猜你喜欢
      • 2011-05-03
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      相关资源
      最近更新 更多