PowerShell Array.Add vs + =

J’ai trouvé un comportement intéressant dans les tableaux PowerShell, à savoir si je déclare un tableau comme:

$array = @() 

Et puis essayez d’append des éléments en utilisant la méthode $array.Add("item") , je reçois l’erreur suivante:

 Exception calling "Add" with "1" argument(s): "Collection was of a fixed size." 

Cependant, si j’ajoute des éléments en utilisant $array += "item" , l’élément est accepté sans problème et la ressortingction “taille fixe” ne semble pas s’appliquer.

Pourquoi est-ce?

Lorsque vous utilisez la méthode $array.Add() , vous essayez d’append l’élément dans le tableau existant. Un tableau est une collection de taille fixe, vous recevrez donc une erreur car elle ne peut pas être étendue.

$array += $element crée un nouveau tableau avec les mêmes éléments que l’ancien + le nouvel élément, et ce nouveau tableau plus grand remplace l’ancien dans la variable $array

Vous pouvez utiliser l’opérateur + = pour append un élément à un tableau. Lorsque vous l’utilisez, Windows PowerShell crée en réalité un nouveau tableau avec les valeurs du tableau d’origine et la valeur ajoutée. Par exemple, pour append un élément de valeur 200 au tableau dans la variable $ a, tapez:

  $a += 200 

Source: about_Arrays

+= est une opération coûteuse, donc lorsque vous devez append de nombreux éléments, vous devez essayer de les append dans le moins d’opérations possibles, par exemple:

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

Si ce n’est pas possible, envisagez d’utiliser une collection plus efficace comme List ou ArrayList (voir l’autre réponse).

Si vous voulez un tableau de taille dynamic, vous devriez faire une liste. Non seulement vous .Add() fonctionnalité .Add() , mais comme l’explique @ frode-f, c’est plus efficace en .Add() mémoire et une meilleure pratique de toute façon.

Et c’est si facile à utiliser.

Au lieu de votre déclaration de tableau, essayez ceci:

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

L’ajout d’éléments est simple.

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

Et si vous voulez vraiment un tableau lorsque vous avez terminé, il y a aussi une fonction pour cela.

 $outItems.ToArray()