【问题标题】:PowerShell function for adding elements to an array用于向数组添加元素的 PowerShell 函数
【发布时间】:2013-11-23 12:26:20
【问题描述】:

我对 PowerShell 还是很陌生,我正在尝试创建一些函数,这些函数可以组合在一起来创建和管理数组。我在让这些功能之一按预期工作时遇到了一些问题。

我需要第二个函数 (AddToArray) 将元素添加到指定索引。现有元素都不能被覆盖或删除。

例如,如果我有一个包含四个索引的数组并且所有索引的值都为 5,我调用函数 AddToArray 2 4。我需要在第三个索引中写入的函数并将现有索引向下移动一步,所以数组现在看起来像这样:

5
5
4
5
5

到目前为止,这是我的代码,它显示了我的 CreateArray 函数和 AddToArray 函数的小代码片段。我已经尝试了一段时间,但我只是看不到解决方案。

function CreateArray($Item1, $Item2)
{
    $arr = New-Object Array[] $Item1;

    # Kontrollerar om $Item2 har fått någon input och skriver in det i arrayen
    if ($Item2)
    {
        for($i = 0; $i -lt $arr.length; $i++)
        {
            $arr[$i] = $Item2;
        }
    }
    # Standard värde på arrayens index om inget värde anges vid funktionens anrop
    else
    {
        $Item2 = "Hej $env:username och välkommen till vårat script!";

        for($i = 0; $i -lt $arr.length; $i++)
        {
            $arr[$i] = $Item2;
        }
    }
    $script:MainArray = $arr;
}

function AddToArray ($index, $add)
{
    $MainArray[$index] = $add;
}

【问题讨论】:

  • 如果您使用 ArrayList 而不是数组,那么在索引处插入的能力已经为您准备好了

标签: arrays function powershell


【解决方案1】:

.NET 中的数组不直接支持插入,它们通常是固定大小的。 PowerShell 确实允许轻松调整数组大小,但如果数组变大并且您要追加(导致调整大小)很多,则性能可能会很差。

一种简单的方法是从片段中创建一个新数组,例如:

if ($index -eq 0) {
    $MainArray = $add,$MainArray
}
elseif ($index -eq $MainArray.Count - 1) {
    $MainArray += $add
}
else {
    $MainArray = $MainArray[0..($index-1)], $add, $MainArray[$index..($MainArray.Length-1)]
}

但这有点像喷子。我会为此使用 List,它支持插入并且比数组更有效。

$list = new-object 'System.Collections.Generic.List[object]'
$list.AddRange((1,2,3,4,5))
$list.Insert(2,10)
$list

如果您确实需要一个数组,请在完成对列表的操作后调用 $list.ToArray() 方法。

【讨论】:

    【解决方案2】:

    数组没有 .insert() 方法,但集合有。从数组生成集合的一种简单方法是使用 scriptblock 的 .invoke() 方法:

    $array = 5,5,4,5,5
    
    $collection = {$array}.invoke()
    $collection
    $collection.GetType()
    
    5
    5
    4
    5
    5
    
    IsPublic IsSerial Name                                     BaseType                                  
    -------- -------- ----                                     --------                                  
    True     True     Collection`1                             System.Object                             
    

    现在您可以使用 .insert() 方法在任意索引处插入元素:

    $collection.Insert(2,3)
    $collection
    
    
    5
    5
    3
    4
    5
    5
    

    如果您需要再次将其转换为数组,将其转换回数组的简单方法是使用管道:

    $collection | set-variable array
    $array
    $array.GetType()
    
    5
    5
    3
    4
    5
    5
    
    IsPublic IsSerial Name                                     BaseType                                  
    -------- -------- ----                                     --------                                  
    True     True     Object[]                                 System.Array                              
    

    【讨论】:

      猜你喜欢
      • 2013-06-06
      • 2022-01-20
      • 2016-05-11
      • 2017-08-30
      • 2014-08-03
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多