是否有一种方法可以更改行为,使得无法从循环内部更新循环的集合变量,并在下一次迭代中使用新值?
例如:
$items = @(1,1,1,2)
$counter = 0
foreach ($item in $items) {
$counter += 1
Write-Host "Iteration:" $counter " | collection variable:" $items
$item
$items = $items | Where-Object {$_ -ne $item}
}
$counter
如果运行此代码,循环将执行多次。
但是,由于第一次迭代$items
从1,1,1,2
更改为仅包含2
,因此循环应该只运行一次。
我怀疑这是因为收集变量$items
在foreach部分中没有更新。
有没有办法解决这个问题?
答案 0 :(得分:2)
您不能将foreach
循环与正在循环主体中修改的集合一起使用。
尝试这样做实际上会导致错误(Collection was modified; enumeration operation may not execute.
)
没有看到错误的原因是您实际上并没有修改原始集合;您正在将 new 集合实例分配给相同的变量,但这与所枚举的原始集合实例无关。
您应该改为使用while
循环,在这种情况下,$items
变量引用将在每次迭代中重新求值:
$items = 1, 1, 1, 2
$counter = 0
while ($items) { # Loop as long as the collection has at last 1 item.
$counter += 1
Write-Host "Iteration: $counter | collection variable: $items"
$item = $items[0] # access the 1st element
$item # output it
$items = $items | Where-Object {$_ -ne $item} # filter out all elements with the same val.
}
现在您只有2次迭代:
Iteration: 1 | collection variable: 1 1 1 2
1
Iteration: 2 | collection variable: 2
2