2011-05-06 32 views
2

如果我有一個具有多值名稱的散列表,當我進行查找時如何指定名稱?如何查找散列表中的多值名稱?

這裏有一些人爲的例子...

$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[...]中指定哪些值才能獲得值?

+0

沒辦法!算了吧!它可以在其他語言中工作(例如在** Ruby **作品中),而不是在時髦中。 – 2011-05-06 13:47:29

回答

4

你的問題是,你正在使用數組作爲哈希表的鍵。只是爲了說明這裏出了什麼問題:

PS Home:\> $x=$false,$false 
PS Home:\> [email protected]($binary.Keys)[0] 
PS Home:\> $x 
False 
False 
PS Home:\> $y 
False 
False 
PS Home:\> $x.Equals($y) 
False 

這兩個對象也有不同的哈希碼。在散列表中使用它們不會是一個好主意,因爲除非使用與哈希表中完全相同的引用,否則無法再次提取這些值。

越容易EAY很可能會使用一個單獨的對象爲重點:

$binary = @{ 
    0 = "!A and !B" 
    1 = "!A and B" 
    10 = "A and !B" 
    11 = "A and B" 
} 

或相似。然後提取

$binary[01] 

將按照預期產生"!A and B"

還要注意,一個列表將具有相同的問題。元組可能的工作,但這些都不是可以在.NET 2

+0

感謝您解釋爲什麼它不起作用。我結合了你的答案(做一個單一的值鍵)和mjolinor(組合鍵爲一個字符串)。 – WileCau 2011-05-08 10:47:52

2

這是一個不是最真誠的解決方案,但取決於你想做什麼,它可以幫助。

$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 
1

也許不是你想要看什麼,但:

$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 
+1

'「$($ false,$ true)」'是做這件事更簡單的方法。或者只是「False True」:-) – Joey 2011-05-06 16:42:12

+0

這個更短。無論哪種方式,它基本上與您發佈的答案相同,即將密鑰降至標量。 – mjolinor 2011-05-06 17:26:18

+1

確實。不過這很微妙。並需要一點.NET的知識。如果你來自C#的PowerShell可能相當明顯,但除此之外... – Joey 2011-05-06 17:28:00

相關問題