我在寻找其他东西的时候点击了这个,所以除了这个例子之外没有更宽泛的代码或目的:
$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
上 Here是this[Object key]
的CoreCLR Hashtable来源,尽管我无法做出与此相关的任何内容。也许这是在更高级别的PowerShell哈希表处理(我还没有找到)。
答案 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)