Power Shell语法笔记/02 数据结构(数组、序列和哈希表)

内容纲要

数据结构用来组织多段数据,主要有三种类型:数组,ArrayList和哈希表

01 数组

可以用一个变量表示一组元素。

$colorPicker = @('blue', 'white','yellow')

可以掺杂数字吗?可以

$color = @(1,2, "2daw",4)
$color
1
2
2daw
4

访问数组元素 $color[-1]返回最后一个元素。从0开始,这都很正常。

范围运算符可以访问数组的多个元素,

$colorpicker[1..3]

数组添加

$colorpicker += 'black'

一次添加多个元素

$colorpicker += @('white', 'green')

数组元素比较难删除,且没有-=这样的符号。

02 ArrayList

数组不太灵活,因为每次添加元素,实际上是删除旧数组,重新创建新数组,PowerShell的数组大小是固定的,所以只能这么删除新建,所以大型数组的处理,性能影响非常明显。

ArrayList的创建只需要在声明前添加 [System.Collections.ArrayList]

[System.Collections.ArrayList]@('wad','asdawd',6)

ArrayList的行为基本上与PowerShell数组一样,只有一个明显区别:大小不固定
ArrayList有哪些属性和方法呢?

Get-Member -InputObject $color

   TypeName:System.Collections.ArrayList

Name           MemberType            Definition                                                                                                                                                                                                             
----           ----------            ----------                                                                                                                                                                                                             
Add            Method                int Add(System.Object value), int IList.Add(System.Object value)                                                                                                                                                       
AddRange       Method                void AddRange(System.Collections.ICollection c)                                                                                                                                                                        
BinarySearch   Method                int BinarySearch(int index, int count, System.Object value, System.Collections.IComparer comparer), int BinarySearch(System.Object value), int BinarySearch(System.Object value, System.Collections.IComparer comparer)
Clear          Method                void Clear(), void IList.Clear()                                                                                                                                                                                       
Clone          Method                System.Object Clone(), System.Object ICloneable.Clone()                                                                                                                                                                
Contains       Method                bool Contains(System.Object item), bool IList.Contains(System.Object value)                                                                                                                                            
CopyTo         Method                void CopyTo(array array), void CopyTo(array array, int arrayIndex), void CopyTo(int index, array array, int arrayIndex, int count), void ICollection.CopyTo(array array, int index)                                    
Equals         Method                bool Equals(System.Object obj)                                                                                                                                                                                         
GetEnumerator  Method                System.Collections.IEnumerator GetEnumerator(), System.Collections.IEnumerator GetEnumerator(int index, int count), System.Collections.IEnumerator IEnumerable.GetEnumerator()                                         
GetHashCode    Method                int GetHashCode()                                                                                                                                                                                                      
GetRange       Method                System.Collections.ArrayList GetRange(int index, int count)                                                                                                                                                            
GetType        Method                type GetType()                                                                                                                                                                                                         
IndexOf        Method                int IndexOf(System.Object value), int IndexOf(System.Object value, int startIndex), int IndexOf(System.Object value, int startIndex, int count), int IList.IndexOf(System.Object value)                                
Insert         Method                void Insert(int index, System.Object value), void IList.Insert(int index, System.Object value)                                                                                                                         
InsertRange    Method                void InsertRange(int index, System.Collections.ICollection c)                                                                                                                                                          
LastIndexOf    Method                int LastIndexOf(System.Object value), int LastIndexOf(System.Object value, int startIndex), int LastIndexOf(System.Object value, int startIndex, int count)                                                            
Remove         Method                void Remove(System.Object obj), void IList.Remove(System.Object value)                                                                                                                                                 
RemoveAt       Method                void RemoveAt(int index), void IList.RemoveAt(int index)                                                                                                                                                               
RemoveRange    Method                void RemoveRange(int index, int count)                                                                                                                                                                                 
Reverse        Method                void Reverse(), void Reverse(int index, int count)                                                                                                                                                                     
SetRange       Method                void SetRange(int index, System.Collections.ICollection c)                                                                                                                                                             
Sort           Method                void Sort(), void Sort(System.Collections.IComparer comparer), void Sort(int index, int count, System.Collections.IComparer comparer)                                                                                  
ToArray        Method                System.Object[] ToArray(), array ToArray(type type)                                                                                                                                                                    
ToString       Method                string ToString()                                                                                                                                                                                                      
TrimToSize     Method                void TrimToSize()                                                                                                                                                                                                      
Item           ParameterizedProperty System.Object Item(int index) {get;set;}                                                                                                                                                                               
Capacity       Property              int Capacity {get;set;}                                                                                                                                                                                                
Count          Property              int Count {get;}                                                                                                                                                                                                       
IsFixedSize    Property              bool IsFixedSize {get;}                                                                                                                                                                                                
IsReadOnly     Property              bool IsReadOnly {get;}                                                                                                                                                                                                 
IsSynchronized Property              bool IsSynchronized {get;}                                                                                                                                                                                             
SyncRoot       Property              System.Object SyncRoot {get;}                               

2.2 ArrayList 元素的添加与删除

调用 Add函数

$colorPicker.Add('gray')

删除使用Remove()

$colorPicker.Remove("key")

删除元素之前不需要知道索引,如果数组中有多个元素值相同,那么删除离头部最近的元素。
元素个数小于100个,数组和ArrayList的性能区分不大。

03 哈希表

如果只关注数据在列表中的位置,使用数组或者ArrayList即可,但如果我们想将两个数据对应起来,可以使用哈希表(字典)。
哈希表区分数组的显著特征是不使用数字索引,通过key去获取value。

哈希表的创建

$users = @{
            abertram = 'Adam Bertram'
            rawaoisjd = 'Raquel Cerillo'
            zewad = 'Justin Zheng'
}

注意 PowerShell不允许创建有重复key 的哈希表,且每个 key都要唯一指向一个value,这个值可以是数组。

哈希表的访问

$users[abertram]

或者使用 .

$users.abertram

3.1 读取哈希表的所有key 和 value

$users.keys

$users.values

3.2 添加和修改哈希表的元素

#users.add([key], [value])
#users[key] = value

3.3 删除哈希表中的元素

$users.remove[key]