Powershell: итерация по глобальному ArrayList не соответствует ожиданиям - PullRequest
1 голос
/ 27 апреля 2020

Я использую код ниже:

$global:accountArray =  New-Object -TypeName "System.Collections.ArrayList"


$global:accountArray.Add("0001")
$global:accountArray.Add("0002")
$global:accountArray.Add("0003")
$global:accountArray.Add("0004")
$global:accountArray.Add("0005")

Function Remove-Numbers
{
    // This loop only iterates one time
    foreach ($n in $global:accountArray) {
            $global:accountArray.Remove($n)
    }
}

Remove-Numbers

Я объявил глобально переменную accountArray, но когда я пытаюсь изменить эту переменную в Function, она повторяется только один раз, и l oop заканчивается ( т.е. он удаляет только один элемент), что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 27 апреля 2020

Вы не можете изменить коллекцию наподобие ArrayList, повторяя ее элементы подобным образом.

Если все, что вы хотите сделать, это очистить список, используйте $global:accountArray.Clear()

Если вы хотите использовать все oop, сделайте это, используя индекс элемента и go снизу вверх:

Function Remove-Numbers {
    # use a loop to remove the items. go from last to first
    for ($i = $global:accountArray.Count -1; $i -ge 0; $i--) {
            $global:accountArray.RemoveAt($i)
    }
} 

Или используйте метод Remove, немного отличающийся, позволив $n не быть членом списка сам по себе, но просто значение, которое он хранит:

Function Remove-Numbers {
    # use a loop to remove the items. Iterate using the value of the item, not the item itself.
    foreach ($n in $global:accountArray.ToArray()) {
        $global:accountArray.Remove($n)
    }
}

PS символ комментария в PowerShell - #, а не //

3 голосов
/ 27 апреля 2020

Вы не можете изменить список, через который вы просматриваете. Коллекция изменена, поэтому она не та, с которой она началась. Вы можете вызвать ToArray () в списке, чтобы исправить это.

Function Remove-Numbers
{
    foreach ($n in $global:accountArray.ToArray()) {
            $global:accountArray.Remove($n)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...