在 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" 0offset索引集中的输入索引 ($_)。

    • 对于小于或等于最大值的索引。索引,这与 $_ - $startIndex.
    • 相同
    • 对于更高的索引,它是 $_ - $startIndex 余数 除以索引/条目数 ($notes.Count),这是一个数字"loops around" 表示定义的索引中基于 0 的偏移量。
  • $startNdx + 然后将起始索引添加到结果中,产生所需的目标索引。