217 votes

Array.Add vs +=

J'ai découvert un comportement intéressant dans PowerShell Arrays, à savoir que si je déclare un tableau comme :

$array = @()

Et ensuite, essayez d'y ajouter des éléments en utilisant la fonction $array.Add("item") je reçois l'erreur suivante :

Exception lors de l'appel de "Add" avec "1" argument(s) : "La collection était d'une taille fixe."

Cependant, si j'ajoute des éléments en utilisant $array += "item" Si l'article est accepté sans problème, la restriction de la "taille fixe" ne semble pas s'appliquer.

Pourquoi ?

297voto

Frode F. Points 12953

Lorsque vous utilisez le $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 nuevo avec les mêmes éléments que l'ancien tableau + le nouvel élément, et ce nouveau tableau plus grand remplace l'ancien dans le fichier $array -variable

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

    $a += 200

Source : sur_Arrays

+= est une opération coûteuse, donc lorsque vous devez ajouter de nombreux éléments, vous devez essayer de les ajouter en un minimum d'opérations, par ex :

$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 o ArrayList (voir l'autre réponse).

144voto

Si vous voulez un tableau de taille dynamique, vous devez créer une liste. Non seulement vous obtiendrez le .Add() mais, comme l'explique @frode-f, les tableaux dynamiques sont plus efficaces en termes de mémoire et constituent de toute façon une meilleure pratique.

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 une fonction pour cela aussi.

$outItems.ToArray()

14voto

js2010 Points 823

L'idiome le plus courant pour créer un tableau sans utiliser la méthode inefficace += est quelque chose comme ça, à partir de la sortie d'une boucle :

$array = foreach($i in 1..10) { 
  $i
}
$array

Ajout à un tableau préexistant :

[collections.arraylist]$array = 1..10
$array.add(11) > $null

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X