You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PowerShell的[Ordered]哈希表中获取指定键的索引?

PowerShell有序哈希表获取键索引的问题解答

为什么$ordered.Keys.IndexOf('two')返回数组?

$ordered.Keys的类型是[System.Collections.Specialized.OrderedDictionary+KeyCollection],这个集合本身没有公开的实例级IndexOf方法。当你直接调用$ordered.Keys.IndexOf('two')时,PowerShell会触发成员枚举:遍历集合中的每个字符串键,对每个键调用字符串自身的IndexOf方法(判断'two'是否是当前键的子串),所以返回的是每个键调用后的结果数组——匹配的键返回0,不匹配的返回-1,这显然不是你要的索引值。

能不能让$ordered.Keys.IndexOf([String])的方式生效?

直接用$ordered.Keys.IndexOf(...)的形式无法实现获取键的索引,因为该集合没有对应的实例方法。不过可以通过先将Keys集合转换为普通数组,再调用数组的IndexOf实例方法来达到类似写法:

# 转换为数组后调用实例方法
$ordered = [ordered]@{one=1; two=2; three=3}
($ordered.Keys -as [array]).IndexOf('two')  # 返回1
# 或者用@()强制转换为数组
@($ordered.Keys).IndexOf('three')  # 返回2

推荐的实现方式

除了上面的数组转换写法,还有两种更直接的方式:

  1. 使用[Array]::IndexOf静态方法(这是你已经验证有效的方式):
    [Array]::IndexOf($ordered.Keys, 'three')  # 返回2
    
    这个静态方法可以直接接受KeyCollection类型的参数,无需额外转换。
  2. 手动遍历索引查找:
    如果需要更灵活的逻辑(比如忽略大小写匹配),可以手动遍历有序哈希表的索引:
    $targetKey = 'two'
    $index = -1
    for ($i = 0; $i -lt $ordered.Count; $i++) {
        if ($ordered.Keys[$i] -eq $targetKey) {
            $index = $i
            break
        }
    }
    $index  # 返回1
    

内容的提问来源于stack exchange,提问作者Gordon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:40:31