2012-11-21 86 views
3

在Windows PowerShell博客上阅读this helpful article之后,我意识到我可以“移出”阵列的第一部分,但不知道如何“移位”或将元素推送到阵列的前端电源外壳。PowerShell阵列unshift

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

## 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元素。

想法?

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

答:

看起来像最好的解决办法是在必要的时候预先创建空数组,而不是围绕$空问题的代码。这是使用.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] | %{$_} 

回答

4

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

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

我喜欢。最终,我需要主动创建空数组,然后才能向其中添加项目。使它成为一个ArrayList意味着我的代码更具可读性。 – jsuddsjr