Powershell添加成员.添加一个ArrayList的成员?

Bag*_*era 2 arrays powershell

Powershell"add-member"命令非常有用.我用它来为自定义对象添加属性.有时我将一个成员设置为一个数组来保存多个对象.是否可以在自定义对象上添加ArrayList作为成员?

想象一下,文章列表中包含"索引","标题"和"关键字"属性.在Powershell中,您可以将此代码放在循环中:

for($i = 0; $i -lt 100; $i++) {
    $a = new-object -TypeName PSObject
    $a | Add-Member -MemberType NoteProperty -Name index -Value $i
    $a | Add-Member -MemberType NoteProperty -Name title -Value "Article $i"
    $a | Add-Member -MemberType NoteProperty -Name keywords -Value @()
    $articles += $a
}
Run Code Online (Sandbox Code Playgroud)

你最终会得到一个Article对象的数组文章,每个对象都包含成员索引,标题和关键字.此外,关键字成员是一个可以有多个条目的数组:

$articles[2].keywords += "Stack Exchange", "Powershell", "ArrayLists"
$articles[2].keywords[2]
Powershell
Run Code Online (Sandbox Code Playgroud)

这满足了我的大部分需求,但我不喜欢处理数组.如果只是因为,ArrayLists更容易使用

$arrayList1.remove("value")
Run Code Online (Sandbox Code Playgroud)

比直觉更直观

$array1 = $array1 |? {$_ new "value"}
Run Code Online (Sandbox Code Playgroud)

Add-Member是否有办法将ArrayList添加为成员?还是我坚持阵列?如果Powershell不支持,那么我可以使用一些C#代码来创建一个以ArrayList为成员的新类吗?

Col*_*350 9

$arr = @("one","two","three")
$arr.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                       
-------- -------- ----                                     --------                                                                                       
True     True     Object[]                                 System.Array   

$a = new-object -TypeName PSObject 
[System.Collections.ArrayList]$arrList=$arr
$a | Add-Member -MemberType NoteProperty -Name ArrayList -value $arrlist

$a.ArrayList

one
two
three

$a.ArrayList.remove("one")
$a.ArrayList

two
three
Run Code Online (Sandbox Code Playgroud)

要将空白ArrayList添加到自定义对象,只需使用

$a | Add-Member -MemberType NoteProperty -Name ArrayList -value (New-object System.Collections.Arraylist)
Run Code Online (Sandbox Code Playgroud)


Eri*_*ris 5

我发现所有这些添加成员的东西仅对数据来说令人困惑。在 powershell 3 中,您可以从哈希表创建一个对象,并使用我从博客中学到的关于使用 Invoke 获取 Collection 类型对象的一些知识:

$myObject = [PSCustomObject]@{
        index = $idx;
        title = $title;
        keywords = {@()}.Invoke()
    }

$myObject.keywords.Add("foo")
$myObject.keywords.Add("bar")

Write-Host "Original"
$myObject.keywords
Write-Host

Write-Host "New:"
[void]$myObject.keywords.Remove("foo")
$myObject.keywords
Write-Host

Original
foo
bar

New:
bar
Run Code Online (Sandbox Code Playgroud)