Daniel, parte de nuestro equipo de trabajo, nos ha hecho el favor de redactar esta sección ya que conoce muy bien este tema.
Solución:
Utilizar New-Object
en este caso:
PS> $arr = New-Object int[] 10000; $arr.length
10000
O, en PSv5+, usando el static new()
método en el tipo:
PS> $arr = [int[]]::new(10000); $arr.length
10000
Estos comandos crean un fuertemente escrito arrayusando el tipo base [int]
en este ejemplo. Si el caso de uso lo permite, esto es preferible por razones de rendimiento y seguridad de tipo.
Si lo necesitas crear un “sin tipo” array de la misma manera que lo hace PowerShell ([System.Object[]]
), sustituir object
por int
; p.ej, [object[]]::new(10000)
; los elementos de tal array se establecerá por defecto en $null
.
La útil respuesta de TessellatingHeckler, sin embargo, muestra mucho mas conciso alternativa que incluso te permite inicializar todos los elementos a un valor específico.
Las matrices tienen un tamaño fijo; si tu necesito un array-como una estructura de datos que puede preasignar y crecer dinámicamentevea la ayuda de Bluecakes [System.Collections.ArrayList]
-respuesta basada.
[System.Collections.ArrayList]
es el análogo redimensionable de [System.Object[]]
y es genérico equivalente – que les gusta el [int[]]
ejemplo anterior – le permite utilizar una específico escribe para el rendimiento y la robustez (si es factible), es [System.Collections.Generic.List[
p.ej:
PS> $lst = [System.Collections.Generic.List[int]]::New(10000); $lst.Capacity
10000
Tenga en cuenta que, al igual que con [System.Collections.ArrayList]
– especificando un capacidad inicial (10000
aquí) no asigna el uso interno array con ese tamaño inmediatamente – el valor de capacidad simplemente se almacena (y se expone como propiedad .Capacity
), y un interno array con esa capacidad (tamaño interno que deja espacio para el crecimiento) se asigna a pedido, cuando se agrega el primer elemento a la lista.
[System.Collections.Generic.List[
‘s .Add()
método lo hace encomiable no producir resultados, mientras que [System.Collections.ArrayList]
hace (devuelve el índice del elemento que se acaba de agregar).
PS> $al = [System.Collections.ArrayList]::new(); $al.Add('first elem')
0 # .Add() outputs the index of the newly added item
# Simplest way to suppress this output:
PS> $null = $al.Add('first elem')
# NO output.
PS> $gl = [System.Collections.Generic.List[string]]::new(); $gl.Add('first elem')
# NO output from .Add()
En PowerShell
tienes razon en eso +=
destruirá lo viejo array y crear un nuevo array con los nuevos elementos.
Para trabajar con una gran colección de elementos, recomiendo encarecidamente utilizar el ArrayList
escriba desde .NET ya que este no es un tamaño fijo array entonces PowerShell
no lo destruirá cada vez que le agregue un elemento y he encontrado que esto funciona mejor en mis proyectos.
Utilizando ArrayList
también significa que no necesita comenzar con 10000 elementos. Porque PowerShell
no necesitará volver a crear su array cada vez, puede comenzar con 0 y luego agregar cada elemento según sea necesario en lugar de comenzar con 10000.
Así que en tu guión crearía un vacío ArrayList
al igual que
[System.Collections.ArrayList]$arr = @()
y luego, cuando necesite agregarle algo, simplemente llame .Add()
(No es necesario rellenar previamente el array con 10000 elementos, se expandirá a medida que agregue elementos).
$arr.Add([int]0)
Su ejemplo usando un ArrayList
:
[System.Collections.ArrayList]$arr = @()
for ($i = 1; $i -le 10000; $i++)
$arr.Add([int]0)
Multiplicación literal de matrices:
$arr = @($null) * 10000
Aquí puedes ver las comentarios y valoraciones de los usuarios
Al final de la post puedes encontrar los comentarios de otros programadores, tú igualmente puedes mostrar el tuyo si lo crees conveniente.