PowerShell function for adding elements to an array

后端 未结 2 1785
甜味超标
甜味超标 2021-01-16 05:31

I\'m still quite new to PowerShell and am trying to create a few functions that weaves together for creating and administrating an array. And I\'m having some problems with

相关标签:
2条回答
  • 2021-01-16 05:41

    Arrays in .NET don't directly support insertion and they are normally fixed size. PowerShell does allow for easy array resizing but if the array gets large and you're appending (causing a resize) a lot, the performance can be bad.

    One easy way to do what you want is to create a new array from the pieces e.g.:

    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)]
    }
    

    But that is kind of a spew. I would use a List for this, which supports insertion and is more efficient than an array.

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

    And if you really need an array, call the $list.ToArray() method when you're done manipulating the list.

    0 讨论(0)
  • 2021-01-16 05:42

    Arrays don't have an .insert() method, but collections do. An easy way to produce a collection from an array is to use the .invoke() method of scriptblock:

    $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                             
    

    Now you can use the .insert() method to insert an element at an arbitrary index:

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

    If you need it to be an array again, an easy way to convert it back to an array is to use the pipeline:

    $collection | set-variable array
    $array
    $array.GetType()
    
    5
    5
    3
    4
    5
    5
    
    IsPublic IsSerial Name                                     BaseType                                  
    -------- -------- ----                                     --------                                  
    True     True     Object[]                                 System.Array                              
    
    0 讨论(0)
提交回复
热议问题