在 powershell 中遍历 "pseudo infinite" 哈希
iterate through a "pseudo infinite" hash in powershell
好的,所以我的问题的标题可能有点含糊,因为我想在数组中循环 "infinitely",这与陷入无限循环不同...所以这就是我的意思:
考虑一下:
$notes=@{1='A';2='B';3='C';4='D';5='E';6='F';7='G'};
我希望能够从上面的列表中选择任何项目,比如给我 1、3、5 (A、C、E),但是如果我的选择超出哈希的大小,那么我需要 powershell弄清楚如何移回 table 的开头;例如,如果我说我想要项目 5,7 和 9,那么就是 E、G 和 B。
有什么简单的方法吗?
非常感谢。
可能不是最理想的解决方案,但您始终可以使用 while 循环并减去 $notes
的计数,直到它小于计数:
$notes=@{1='A';2='B';3='C';4='D';5='E';6='F';7='G'};
$selection2 = 7, 8, 9, 10, 20, 21, 23
foreach ($item IN $selection2) {
while ($item -gt $notes.count ) {
$item = $item - $notes.count
}
Write-Output $notes[$item]
}
结果是:
G
A
B
C
F
G
B
或者,如果您的数组从 0 而不是 1 开始,您可以使用更简单的模数:
$notes=@{0='A';1='B';2='C';3='D';4='E';5='F';6='G'};
$selection2 = 5, 7 ,9
foreach ($item IN $selection2) {
Write-Output $notes[$item % $notes.count]
}
方向正确,但可以一概而论:
顺便说一句:您的 $notes
变量是一个 哈希表 (@{ ... }
),而不是 数组 .
$notes=@{ 1='A'; 2='B'; 3='C'; 4='D'; 5='E'; 6='F'; 7='G' }
# The lowest index (key) in $notes.
# All other indices (keys) are assumed to be contiguous.
$startNdx = 1
5, 7, 9 | ForEach-Object { $notes[$startNdx + ($_ - $startNdx) % $notes.Count] }
以上结果:
E
G
B
解释:
($_ - $startNdx) % $notes.Count
使用 %
, the modulus operator,计算基于 "infinite" 0
的 offset索引集中的输入索引 ($_
)。
- 对于小于或等于最大值的索引。索引,这与
$_ - $startIndex
. 相同
- 对于更高的索引,它是
$_ - $startIndex
的 余数 除以索引/条目数 ($notes.Count
),这是一个数字"loops around" 表示定义的索引中基于 0
的偏移量。
$startNdx +
然后将起始索引添加到结果中,产生所需的目标索引。
好的,所以我的问题的标题可能有点含糊,因为我想在数组中循环 "infinitely",这与陷入无限循环不同...所以这就是我的意思:
考虑一下:
$notes=@{1='A';2='B';3='C';4='D';5='E';6='F';7='G'};
我希望能够从上面的列表中选择任何项目,比如给我 1、3、5 (A、C、E),但是如果我的选择超出哈希的大小,那么我需要 powershell弄清楚如何移回 table 的开头;例如,如果我说我想要项目 5,7 和 9,那么就是 E、G 和 B。
有什么简单的方法吗?
非常感谢。
可能不是最理想的解决方案,但您始终可以使用 while 循环并减去 $notes
的计数,直到它小于计数:
$notes=@{1='A';2='B';3='C';4='D';5='E';6='F';7='G'};
$selection2 = 7, 8, 9, 10, 20, 21, 23
foreach ($item IN $selection2) {
while ($item -gt $notes.count ) {
$item = $item - $notes.count
}
Write-Output $notes[$item]
}
结果是:
G
A
B
C
F
G
B
或者,如果您的数组从 0 而不是 1 开始,您可以使用更简单的模数:
$notes=@{0='A';1='B';2='C';3='D';4='E';5='F';6='G'};
$selection2 = 5, 7 ,9
foreach ($item IN $selection2) {
Write-Output $notes[$item % $notes.count]
}
顺便说一句:您的 $notes
变量是一个 哈希表 (@{ ... }
),而不是 数组 .
$notes=@{ 1='A'; 2='B'; 3='C'; 4='D'; 5='E'; 6='F'; 7='G' }
# The lowest index (key) in $notes.
# All other indices (keys) are assumed to be contiguous.
$startNdx = 1
5, 7, 9 | ForEach-Object { $notes[$startNdx + ($_ - $startNdx) % $notes.Count] }
以上结果:
E
G
B
解释:
($_ - $startNdx) % $notes.Count
使用%
, the modulus operator,计算基于 "infinite"0
的 offset索引集中的输入索引 ($_
)。- 对于小于或等于最大值的索引。索引,这与
$_ - $startIndex
. 相同
- 对于更高的索引,它是
$_ - $startIndex
的 余数 除以索引/条目数 ($notes.Count
),这是一个数字"loops around" 表示定义的索引中基于0
的偏移量。
- 对于小于或等于最大值的索引。索引,这与
$startNdx +
然后将起始索引添加到结果中,产生所需的目标索引。