Array.Add vs +=

前端 未结 3 2067
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-29 19:33

I\'ve found some interesting behaviour in PowerShell Arrays, namely, if I declare an array as:

$array = @()

And then try to add items to it

相关标签:
3条回答
  • 2020-11-29 20:02

    The most common idiom for creating an array without using the inefficient += is something like this, from the output of a loop:

    $array = foreach($i in 1..10) { 
      $i
    }
    $array
    
    0 讨论(0)
  • 2020-11-29 20:05

    If you want a dynamically sized array, then you should make a list. Not only will you get the .Add() functionality, but as @frode-f explains, dynamic arrays are more memory efficient and a better practice anyway.

    And it's so easy to use.

    Instead of your array declaration, try this:

    $outItems = New-Object System.Collections.Generic.List[System.Object]
    

    Adding items is simple.

    $outItems.Add(1)
    $outItems.Add("hi")
    

    And if you really want an array when you're done, there's a function for that too.

    $outItems.ToArray()
    
    0 讨论(0)
  • 2020-11-29 20:20

    When using the $array.Add()-method, you're trying to add the element into the existing array. An array is a collection of fixed size, so you will receive an error because it can't be extended.

    $array += $element creates a new array with the same elements as old one + the new item, and this new larger array replaces the old one in the $array-variable

    You can use the += operator to add an element to an array. When you use it, Windows PowerShell actually creates a new array with the values of the original array and the added value. For example, to add an element with a value of 200 to the array in the $a variable, type:

        $a += 200
    

    Source: about_Arrays

    += is an expensive operation, so when you need to add many items you should try to add them in as few operations as possible, ex:

    $arr = 1..3    #Array
    $arr += (4..5) #Combine with another array in a single write-operation
    
    $arr.Count
    5
    

    If that's not possible, consider using a more efficient collection like List or ArrayList (see the other answer).

    0 讨论(0)
提交回复
热议问题