PowerShell数组不合时宜

时间:2012-11-21 21:16:43

标签: arrays powershell

在Windows PowerShell博客上阅读this helpful article后,我意识到我可以“转移”#34;关闭阵列的第一部分,但不知道如何"取消移动"或者在PowerShell中将元素推送到数组的前面。

我正在创建一个哈希对象数组,最后一个读取项首先被推送到数组。我想知道是否有更好的方法来实现这一目标。

## Create a list of files for this collection, pushing item on top of all other items
if ($csvfiles[$collname]) {
    $csvfiles[$collname] = @{ repdate = $date; fileobj = $csv }, $csvfiles[$collname] | %{$_}
}
else {
    $csvfiles[$collname] = @{ repdate = $date; fileobj = $csv }
}

有几点需要注意:

  1. 我需要使用foreach循环%{$ _}展开前一个数组元素,因为仅引用数组会创建一个嵌套的数组结构。我必须将所有元素放在同一级别。
  2. 我需要区分一个空数组和一个包含元素的数组。如果我尝试展开一个空数组,它会在数组的末尾放置一个$ null元素。
  3. 思想?

    PS:空哈希元素产生NULL值的原因是$ null被视为PowerShell中的标量。有关详细信息,请参阅https://connect.microsoft.com/PowerShell/feedback/details/281908/foreach-should-not-execute-the-loop-body-for-a-scalar-value-of-null

    解答:

    看起来最好的解决方案是在必要时预先创建空数组,而不是围绕$ null问题编写代码。这里是使用.NET ArrayList和本机PoSh数组重写的。

    if (!$csvfiles.ContainsKey($collname)) {
        $csvfiles[$collname] = [System.Collections.ArrayList]@()
    }
    $csvfiles[$collname].insert(0, @{ repdate = $repdate; fileobj = $csv })
    
    ## NATIVE POSH SOLUTION...
    if (!$csvfiles.ContainsKey($collname)) {
        $csvfiles[$collname] = @()
    }
    $csvfiles[$collname] = @{ repdate = $repdate; fileobj = $csv }, `
                           $csvfiles[$collname] | %{$_}
    

2 个答案:

答案 0 :(得分:4)

您可能希望使用ArrayList个对象,因为它们支持在任意位置插入。例如:

# C:\> $a = [System.Collections.ArrayList]@(1,2,3,4)
# C:\> $a.insert(0,6)
# C:\> $a
6
1
2
3
4

答案 1 :(得分:3)

您可以简单地使用加号运算符:

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

注意:这种重新创建实际上是在创建一个新数组,而不是更改现有数组(但是您引用的$head, $tail = $array移位方式也完全一样)。