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的答案(生成一个字符串)的组合。