2016-04-20 52 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 –

回答