获取Powershell循环中当前项的索引?

Bri*_*nga 60 powershell

给定PowerShell中的项目列表,如何在循环中找到当前项目的索引?

例如:

$letters = { 'A', 'B', 'C' }

$letters | % {
  # Can I easily get the index of $_ here?
}
Run Code Online (Sandbox Code Playgroud)

所有这一切的目标是我想使用Format-Table输出一个集合,并添加一个包含当前项目索引的初始列.通过这种方式,人们可以交互式地选择要选择的项目.

Kei*_*ill 60

.NET在System.Array中有一些方便的实用工具方法:

PS> $a = 'a','b','c'
PS> [array]::IndexOf($a, 'b')
1
PS> [array]::IndexOf($a, 'c')
2
Run Code Online (Sandbox Code Playgroud)

评论中对上述方法的好处.除了"只是"找到数组中项目的索引,给定问题的上下文,这可能更合适:

$letters = { 'A', 'B', 'C' }
$letters | % {$i=0} {"Value:$_ Index:$i"; $i++}
Run Code Online (Sandbox Code Playgroud)

Foreach(%)可以有一个执行一次的Begin sciptblock.我们在那里设置了一个索引变量,然后我们可以在进程scripblock中引用它,然后在退出scriptblock之前它会增加.

  • 此外,您可能不希望在迭代这些项时查找数组项的每个索引.这是对每个项目的线性搜索; 听起来像是一次迭代O(n ^ 2):-) (8认同)

Céd*_*Rup 41

不确定是否可以使用"自动"变量.您可以随时为自己声明一个并递增它

$letters = { 'A', 'B', 'C' }
$letters | % {$counter = 0}{...;$counter++}
Run Code Online (Sandbox Code Playgroud)

或者使用for循环代替......

for ($counter=0; $counter -lt $letters.Length; $counter++){...}
Run Code Online (Sandbox Code Playgroud)

  • 这是 foreach-object -Begin {first block} -Process {second block} 的“快捷方式”。第一个块在处理前运行一次,第二个块针对每个要处理的项目运行。有关详细信息,请参阅 get-help foreach-item -full (3认同)
  • 谢谢你 - 我从来没有见过在 foreach 后面有两组花括号的语法。它解决了像这样匹配两个数组的问题:`$selected = $true,$false,$true; @('第一','第二','第三') | % {$i=0}{If($selected[$i]){$_};$i++ } ` 返回 'first' 和 'third' (2认同)

小智 40

有一个内置:)

foreach ($item in $array) {
    $array.IndexOf($item)
}
Run Code Online (Sandbox Code Playgroud)

  • 这是找到匹配数组中每个项目的第一个项目的索引,而不是使用索引值进行迭代.这个速度较慢,如果数组包含重复项,则会得到错误的索引. (26认同)

Sha*_*evy 11

0..($letters.count-1) | foreach { "Value: {0}, Index: {1}" -f $letters[$_],$_}
Run Code Online (Sandbox Code Playgroud)