PowerShell:一个类中包含类对象的数组

5

我创建了一个包含简单值的类:

Class Volumes {
  [String]$ID
  [String]$Name
}

现在我想创建另一个包含 Volume 对象数组的类。

类似于:

Class Storage {
  [String]$Name
  [String]$IP
  [Array]@Volumes  # <- I know this is wrong, but I don't know how to do it
}

因此,有两个问题:

  • 如何在类内创建对象数组?
  • 一旦我已经创建了一个 Storage 类的新对象,如何访问/修改数组成员?

谢谢,Ralf。

1个回答

5
以下示例应该能够让您开始学习!
您可以通过在类型后面简单地放置[]来定义对象数组,例如Volume[]
在代码片段的底部,有两个示例展示了如何访问卷数据。
Class Volume {
  [String]$ID
  [String]$Name 
}

Class Storage {
  [String]$Name
  [String]$IP
  [Volume[]]$Volumes 
}

# Create a volume object
$volume1 = New-Object Volume
$volume1.ID = '1'
$volume1.Name = 'Data'

# Create another volume object
$volume2 = New-Object Volume
$volume2.ID = '2'
$volume2.Name = 'Log'

# Create a storage object
$storage = New-Object Storage
$storage.Name = 'SomeStorage'
$storage.IP = '0.0.0.0'

# Add the volume objects
$storage.Volumes += $volume1
$storage.Volumes += $volume2

# access a volume by name or index
$storage.Volumes | Where-Object {$_.Name -eq 'Data'}
$storage.Volumes[0]

zett42santiago 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()
}

# Create volume objects
$volume1 = New-Object Volume
$volume1.ID = '1'
$volume1.Name = 'Data'

# Create another volume object
$volume2 = New-Object Volume
$volume2.ID = '2'
$volume2.Name = 'Log'

# Create a storage object
$storage = New-Object Storage
$storage.Name = 'SomeStorage'
$storage.IP = '0.0.0.0'

# Add the volume objects
$storage.Volumes.Add($volume1)
$storage.Volumes.Add($volume2)

# access a volume by name or index
$storage.Volumes | Where-Object {$_.Name -eq 'Data'}
$storage.Volumes[0]

非常好用,正是我所需要的。非常感谢! - Ralf Draeger
感谢zett42和santiago squarzon的建议,我已经修改了我的脚本... - Ralf Draeger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接