PowerShell - 为什么在Hashtable中查找数组会返回一个空数组?

时间:2017-06-24 03:14:28

标签: powershell

我在寻找其他东西的时候点击了这个,所以除了这个例子之外没有更宽泛的代码或目的:

$H = @{}                 # new, empty hashtable

                         # String test - lookup fails, hashtable returns $null
$H["test"].GetType()     # "You cannot call a method on a null-valued expression."


                         # Array test - should do the same
$Key = @('a','b')              
$H[$Key].GetType()       # Object[]  what?? Where did this come from? <--<<====<<====<<
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


                         # Double check that ..
$H.ContainsKey($Key)     # False. Doesn't contain the key(!)

$H.Values.Count          # 0. It's empty. As it should be. 

当键是一个数组时, empty 哈希表上的查找如何(为什么)返回object[],但不是这样?

NB。我知道你不能/不应该使用数组作为哈希表键,至少部分是因为数组不相等,除非它们是内存中的相同对象,例如array/object keys for hashtables in powershell;但数组确实有.GetHashCode() - 对于失败的查找,它是否仍然会返回$ null,无论它们是什么键?

发生在Windows / PSv4和Linux / PS6-alpha

Herethis[Object key]的CoreCLR Hashtable来源,尽管我无法做出与此相关的任何内容。也许这是在更高级别的PowerShell哈希表处理(我还没有找到)。

1 个答案:

答案 0 :(得分:2)

这是PowerShell功能,允许您在索引集合时指定索引数组:

$Array = 10..1
$Indexes = 1, 3, 5
$Array[$Indexes] # 9, 7, 5

$Hash = @{
    a = 1
    b = 2
    c = 3
}
$Indexes = 'c', 'f', 'a'
$Hash[$Indexes] # 3, $null, 1
                # System.Collections.Hashtable designed to return null,
                # when asking not existing key.

$String = 'abcdefghijklmnopqrstuvwxyz'
$Indexes = 7, 4, 11, 11, 14
$String[$Indexes] # h, e, l, l, o

如果您真的想将数组的哈希表索引为单个对象,那么您可以使用Item参数化属性:

$Array = 1..10
$Hash = @{ $Array = 'Value' }
$Hash.Item($Array)