Список массивов объектов клонирования Powershell

Я создаю объект 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 была изменена. Хорошо, поэтому я клонирую список проектов. Я нашел код на 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,... в начале. я не знаю почему. Я хотел бы подавить это.

далее я прочитал здесь, что [System.Collections.ArrayList] устарел.

так что я совсем потерялся. должен ли я даже использовать ArrayList, если да, то как мне избавиться от чисел, если я не должен использовать ArrayList, что является правильной альтернативой. или я делаю что-то основное неправильно?

пожалуйста, помогите мне.

Спасибо! С уважением


person crdy    schedule 15.03.2021    source источник
comment
Метод Add() выводит индекс в списке массивов (0,1,2..). Вы можете скрыть это, используя $null = $newobj.Add($nobj) или [void]$newobj.Add($nobj)   -  person Theo    schedule 15.03.2021


Ответы (1)


Как отмечалось, метод Add() в ArrayList выводит индекс, в который добавляется новый элемент. Чтобы подавить этот вывод, просто выполните $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                          
person Theo    schedule 15.03.2021
comment
Спасибо. Да, если я правильно укажу объект для удаления, это тоже сработает для меня. я понятия не имею, почему я этого не видел... я просто люблю переполнение стека, вы, ребята, молодцы - person crdy; 15.03.2021