2016-04-20 87 views
1

我在PowerShell中尋找有效的查找表查找表複合鍵

幼稚的做法是爲大型數據

$data = ` 
    @(
     @{ 
      A = 1; 
      B = 2; 
      C = 3; 
     }, 
     @{ 
      A = 4; 
      B = 5; 
      C = 6; 
     }, 
     @{ 
      A = 7; 
      B = 8; 
      C = 9; 
     } 
    ) 

# looking for value C base on pair (A, B) 

function FindC 
{ 
    param 
    (
     [int] $A, 
     [int] $B 
    ) 

    $data | ` 
     Where-Object -FilterScript { ($_.A -eq $A) -and ($_.B -eq $B) } | ` 
     Select-Object -ExpandProperty C 
} 

我覺得效率不高,有效的方法是使用哈希表,但目前還不清楚如何處理複合鍵。我們不能用哈希表,PSObject或PSCustomObject,因爲他們沒有平等的實現

> @{ A = 1; B = 2; } -eq @{ A = 1; B = 2; } 
False 
> [PSObject] @{ A = 1; B = 2; } -eq [PSObject] @{ A = 1; B = 2; } 
False 
> [PSCustomObject] @{ A = 1; B = 2; } -eq [PSCustomObject] @{ A = 1; B = 2; } 
False 

我不想要實現這種簡單的情況下,我自己的數據類。所以,我迄今發現的唯一的事情是元組

> [Tuple]::Create(1, 2) -eq [Tuple]::Create(1, 2) 
True 

所以我們可以使用元組

$hashtable = @{} 
foreach ($entry in $data) 
{ 
    $hashtable[[Tuple]::Create($entry.A, $entry.B)] = $entry.C 
} 

function FindC 
{ 
    param 
    (
     [int] $A, 
     [int] $B 
    ) 

    $hashtable[[Tuple]::Create($A, $B)] 
} 

任何人都知道更優雅的方式來實現這一目標?

+1

元組應該工作得很好。如果你只想出於任何原因使用Hashtable,那麼你可以實現你自己的方法,像這樣:http://stackoverflow.com/questions/4521905/how-to-compare-associative-arrays-in-powershell –

回答