web-dev-qa-db-fra.com

Array.Add vs + =

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

$array = @()

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

Exception appelant "Ajouter" avec "1" argument (s): "La collection avait une taille fixe."

Toutefois, si j'ajoute des éléments à l'aide de $array += "item", l'élément est accepté sans problème et la restriction "taille fixe" ne semble pas s'appliquer.

Pourquoi est-ce?

153
malgca

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

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

Vous pouvez utiliser l'opérateur + = pour ajouter 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 ajouter un élément avec une valeur de 200 au tableau dans la variable $ a, tapez:

    $a += 200

Source: about_Arrays

+= est une opération coûteuse. Par conséquent, lorsque vous devez ajouter plusieurs éléments, vous devez essayer de les ajouter le moins souvent possible, 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 telle que List ou ArrayList (voir l'autre réponse).

218
Frode F.

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

Et c'est tellement 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 quand vous avez fini, il y a aussi une fonction pour ça.

$outItems.ToArray()
99
user1499731