Powershell 如何在哈希表中查找多值名称?
如果有一个具有多值名称的哈希表,那么在查找时如何指定名称 这里有一些人为的例子Powershell 如何在哈希表中查找多值名称?,powershell,Powershell,如果有一个具有多值名称的哈希表,那么在查找时如何指定名称 这里有一些人为的例子 $unary = @{ $false, "!A"; $true, "A" } $unary Name Value ---- ----- False !A True A $unary[$fals
$unary = @{
$false, "!A";
$true, "A"
}
$unary
Name Value
---- -----
False !A
True A
$unary[$false]
!A
$unary[$true]
A
到目前为止还不错
$binary = @{
($false, $false) = "!A and !B"
($false, $true) = "!A and B"
($true, $false) = "A and !B"
($true, $true) = "A and B"
}
$binary
Name Value
---- -----
{False, True} !A and B
{True, False} A and !B
{True, True} A and B
{False, False} !A and !B
$binary[$false, $true]
//Nothing
$binary[($false, $true)]
//Nothing
$binary[{$false, $true}]
//Nothing
//www.stackoverflow.com... :)
要获得值,我需要在
$binary[…]
中指定什么?这里有一个不太可靠的解决方案,但取决于您想做什么,它会有所帮助
$unary = new-object ‘object[]’ 2
$unary[$false] = "!A"
$unary[$true] = "A"
$binary= new-object ‘object[,]’ 2,2
$binary[$false,$false] = "!A and !B"
$binary[$false,$true] = "!A and B"
$binary[$true,$false] = "A and !B"
$binary[$true,$true] = "A and B"
结果:
PS > $binary[$true,$true]
A and B
您的问题是,您正在使用数组作为哈希表中的键。为了说明这里出了什么问题:
PS Home:\> $x=$false,$false
PS Home:\> $y=@($binary.Keys)[0]
PS Home:\> $x
False
False
PS Home:\> $y
False
False
PS Home:\> $x.Equals($y)
False
这两个对象也有不同的哈希代码。将它们用作哈希表中的键永远都不是一个好主意,因为不能再次提取值,除非使用与放入哈希表中的引用完全相同的引用
使用单个对象作为键可能更容易:
$binary = @{
0 = "!A and !B"
1 = "!A and B"
10 = "A and !B"
11 = "A and B"
}
或类似的。然后提取
$binary[01]
将产生预期的“!A和B”
还要注意的是,列表在平等性方面也会有同样的问题。元组可能有效,但在.NET 2中不可用。可能不是您希望看到的,但是:
$binary = @{
[string]($false,$true) = "!A and B"
[string]($true,$false) = "A and !B"
[string]($true,$true) = "A and B"
}
$binary[[string]($false,$true)]
!A and B
不可能!算了吧!它可以在其他语言中工作(例如Ruby works),而不是在高级语言中。
“$($false,$true)”
是一种较短的方法。或者只是“False-True”
:-)短一点。不管是哪种方式,答案基本上与您发布的答案相同,即将键降到标量。不过这很微妙。并且需要一点.NET的知识。如果您是从C#来到PowerShell的,这可能相当明显,但除此之外…谢谢,将我的多值键转换为字符串是对我已有的内容的一个简单更改,它刚刚起作用。感谢您解释为什么它不起作用。我使用了你的答案(生成一个值键)和mjolinor的答案(生成一个字符串)的组合。