Powershell 克隆对象 ArrayList

Powershell Clone Object ArrayList

我创建了一个具有一些属性的 PSCustom 对象并将其添加到集合中

简而言之

$Collection = @()

foreach ($item in $items)
{
    $obj = New-Object PSCustomObject
    $obj | Add-Member -NotePropertyName Property1 -NotePropertyValue ""
    $obj | Add-Member -NotePropertyName Property2 -NotePropertyValue ""
    $obj | Add-Member -NotePropertyName Property3 -NotePropertyValue ""

$Collection += $obj
}

到目前为止一切正常并且有效。 直到我想从中删除一些东西。 我收到消息说 op_substraction 不是方法。

好的,所以我用谷歌搜索,发现我可以像这样声明集合

$Collection = New-Object System.Collections.Generic.List[System.Object]

我将 += 更改为 $Collection.Add($obj) 现在当我做了 $Collection.Remove($obj) 我没有收到错误,但对象没有被删除。

我在谷歌上搜索了更多,发现 [System.Collections.ArrayList] 首先是更多信息.. 我有以下代码来删除对象($MyItem 包含不应删除哪个对象的信息)

foreach ($Item in $Collection)
{
    if ($MyItem -notcontains $Item.Value)
    {
        $Collection.Remove($Item)
    }
}

所以如果我这样做,它会给出 $Collection 已更改的错误。 好的,所以我克隆了 Opject List。我在SO上找到了一些代码并稍微修改了一下

function clone-Collection($obj)
{
    $newobj = New-Object System.Collections.Generic.List[System.Object]
    foreach ($oobj in $obj)
    {
        $nobj = New-Object PsObject
        $oobj.psobject.Properties | % { Add-Member -MemberType NoteProperty -InputObject $nobj -Name $_.Name -Value $_.Value }
        $newobj.Add($nobj)
    }
    
    return $newobj
}

我调用了函数,在函数中一切正常。 但是 ReturnValue 现在的开头是 0,1,2,...。我不知道为什么。我想压制这个。

我进一步阅读 here [System.Collections.ArrayList] 被贬低了。

所以我几乎迷路了。 我什至应该使用 ArrayList 如果是这样我如何摆脱数字 如果我不应该使用 ArrayList,那么正确的选择是什么。 还是我做错了什么?

请帮助我。

谢谢 问候

如评论所述,ArrayList 上的 Add() 方法输出添加新项目的索引。要抑制此输出,只需执行 $null = $newobj.Add($nobj)[void]$newobj.Add($nobj)

至于通用列表中的 Remove() 方法,如果我正确指定要删除的对象,它对我有用:

$Collection = New-Object System.Collections.Generic.List[System.Object]
$items = 'foo', 'bar', 'baz'
foreach ($item in $items) {
    $obj = New-Object PSCustomObject
    $obj | Add-Member -NotePropertyName Property1 -NotePropertyValue $item
    $obj | Add-Member -NotePropertyName Property2 -NotePropertyValue ""
    $obj | Add-Member -NotePropertyName Property3 -NotePropertyValue ""
    $Collection.Add($obj)

    # or simply do
    # $Collection.Add([PsCustomObject]@{Property1 = $item; Property2 = ''; Property3 = ''})
}

要创建集合的副本,您可以执行以下操作:

$newCollection = [PsCustomObject[]]::new($Collection.Count)
$Collection.CopyTo($newCollection)

从原始 $Collection 中删除一个对象:

$obj = $Collection | Where-Object {$_.Property1 -eq 'bar'}
[void]$Collection.Remove($obj)
$Collection

输出:

Property1 Property2 Property3
--------- --------- ---------
foo                          
baz