powershell array, add, remove elements

Arrays are convenient to use but like in any language adding removing elements dynamically is not very efficient. It is more efficient to use System.Collections.ArrayList or generic List class (instantiating generics is another topic) than Arrays

PS >
PS > [array]$names = @()
PS > $names += "Q"
PS > $names += "picard"
PS > $names += "spock"
PS > $names += 10

PS > $names.Count
4

PS > $names[2]
spock

PS > $names[6]

PS > $names
Q
picard
spock
10
PS >
PS > $names.count = 2
"Length" is a ReadOnly property.
At line:1 char:8
+ $names. <<<< count = 2
 + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
 + FullyQualifiedErrorId : PropertyAssignmentExceptionPS >

PS > $names.GetType()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS > $names[4]
10
PS > $names[4].GetType()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType

PS > $names[2]
spock
PS > $names[2].GetType()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

When declaring an array of one, it might not be an Array

Consider an array of arrays, an array of two elements, each element is in turn an array

PS> $a = @( @("row1-a", "row1-b", "row1-c"), @("row2-a", "row2-b") )
PS> $a.count
2
PS>$a[0].count
3
PS>$a[1].count
2

Now an array of one – not what we would normally expect

PS> $a = @( @("row1-a", "row1-b", "row1-c") )
PS> $a.Count
3

$a becomes just array of three strings instead of an array of 1 element, to get this you have to start the array declaration with a comma

PS> $a = @(, @("row1-a", "row1-b", "row1-c") )
PS> $a.Count
1

Starting an array with more than one element with a comma is fine, it does not add an extra empty element at the beginning :)

References:
http://www.vistax64.com/powershell/13950-how-add-entries-array.html
http://www.powershellpro.com/powershell-tutorial-introduction/variables-arrays-hashes/
http://stackoverflow.com/questions/1390782/jagged-powershell-array-is-losing-a-dimension-when-only-one-element-exists
http://www.justaprogrammer.net/2011/03/30/an-array-of-one-item-in-powershell/

Advertisements

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s