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
我创建了一个具有一些属性的 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