如何在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
推荐的实现方式
除了上面的数组转换写法,还有两种更直接的方式:
- 使用
[Array]::IndexOf静态方法(这是你已经验证有效的方式):
这个静态方法可以直接接受[Array]::IndexOf($ordered.Keys, 'three') # 返回2KeyCollection类型的参数,无需额外转换。 - 手动遍历索引查找:
如果需要更灵活的逻辑(比如忽略大小写匹配),可以手动遍历有序哈希表的索引:$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
相关产品推荐
相关产品推荐

