以下示例应该能够让您开始学习!
您可以通过在类型后面简单地放置[]来定义对象数组,例如
Volume[]
。
在代码片段的底部,有两个示例展示了如何访问卷数据。
Class Volume {
[String]$ID
[String]$Name
}
Class Storage {
[String]$Name
[String]$IP
[Volume[]]$Volumes
}
$volume1 = New-Object Volume
$volume1.ID = '1'
$volume1.Name = 'Data'
$volume2 = New-Object Volume
$volume2.ID = '2'
$volume2.Name = 'Log'
$storage = New-Object Storage
$storage.Name = 'SomeStorage'
$storage.IP = '0.0.0.0'
$storage.Volumes += $volume1
$storage.Volumes += $volume2
$storage.Volumes | Where-Object {$_.Name -eq 'Data'}
$storage.Volumes[0]
由 zett42 和 santiago squarzon 提供的教育性注释。
当您逐个添加许多元素时,数组的效率不高。您可能想要查看 ArrayList/List 类型。
在您的 Storage 类中,您可以使用 [List[Volume]]$Volumes = [List[Volume]]::new()
。请确保在脚本顶部放置 using namespace System.Collections.Generic
。然后,在添加卷时,进行 $storage.Volumes.Add($volume1)
操作。
我进行了一些性能测试,将10,000个卷添加到对象中。数组需要9.3秒,而列表只需要0.93秒,提高了10倍的性能。
数组 - 平方级 - O(N²)
+=
会重新创建整个数组,它将旧内容与新元素一起复制到新数组中。
ArrayList - 常数级 - O(1)
对于任意索引的添加/删除操作,ArrayList 的时间复杂度为 O(n),但是对于列表末尾的操作,时间复杂度为 O(1)。
using namespace System.Collections.Generic
Class Volume {
[String]$ID
[String]$Name
}
Class Storage {
[String]$Name
[String]$IP
[List[Volume]]$Volumes = [List[Volume]]::new()
}
$volume1 = New-Object Volume
$volume1.ID = '1'
$volume1.Name = 'Data'
$volume2 = New-Object Volume
$volume2.ID = '2'
$volume2.Name = 'Log'
$storage = New-Object Storage
$storage.Name = 'SomeStorage'
$storage.IP = '0.0.0.0'
$storage.Volumes.Add($volume1)
$storage.Volumes.Add($volume2)
$storage.Volumes | Where-Object {$_.Name -eq 'Data'}
$storage.Volumes[0]