Array.Add vs +=

Ik heb interessant gedrag gevonden in PowerShell-arrays, namelijk als ik een array declareer als:

$array = @()

En probeer er dan items aan toe te voegen met behulp van de $array.Add("item")methode, ik krijg de volgende foutmelding:

Uitzondering die “Toevoegen” aanroept met “1” argument(en): “Verzameling had een vaste grootte.”

Als ik echter items toevoeg met $array += "item", wordt het item zonder problemen geaccepteerd en lijkt de beperking “vaste maat” niet van toepassing te zijn.

Waarom is dit?


Antwoord 1, autoriteit 100%

Als je de $array.Add()-methode gebruikt, probeer je het element toe te voegen aan de bestaande array. Een array is een verzameling met een vaste grootte, dus u krijgt een foutmelding omdat deze niet kan worden uitgebreid.

$array += $elementcreëert een nieuwearray met dezelfde elementen als de oude + het nieuwe item, en deze nieuwe grotere array vervangt de oude in de $array-variabele

U kunt de operator += gebruiken om een ​​element aan een array toe te voegen. Wanneer je
gebruiken
it, maakt Windows PowerShell in feite een nieuwe array met de waarden van de
originele array en de toegevoegde waarde. Om bijvoorbeeld een element toe te voegen met a
waarde van 200 toe aan de array in de $a variabele, typ:

   $a += 200

Bron: about_Arrays

+=is een dure bewerking, dus als u veel items moet toevoegen, moet u proberen deze in zo min mogelijk bewerkingen toe te voegen, bijvoorbeeld:

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

Als dat niet mogelijk is, overweeg dan een efficiëntere verzameling te gebruiken, zoals Listof ArrayList(zie het andere antwoord).


Antwoord 2, autoriteit 47%

Als u een array van dynamische grootte wilt, moet u een lijst maken. U krijgt niet alleen de .Add()-functionaliteit, maar, zoals @frode-f uitlegt, dynamische arrays zijn geheugenefficiënter en sowieso een betere gewoonte.

En het is zo gemakkelijk te gebruiken.

Probeer dit in plaats van uw arraydeclaratie:

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

Items toevoegen is eenvoudig.

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

En als je echt een array wilt als je klaar bent, is daar ook een functie voor.

$outItems.ToArray()

Antwoord 3, autoriteit 4%

Het meest voorkomende idioom voor het maken van een array zonder de inefficiënte +=te gebruiken, is zoiets als dit, van de uitvoer van een lus:

$array = foreach($i in 1..10) { 
  $i
}
$array
[collections.arraylist]$array = 1..10
$array.add(11) > $null

Other episodes