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)]
}
任何人都知道更優雅的方式來實現這一目標?
元組應該工作得很好。如果你只想出於任何原因使用Hashtable,那麼你可以實現你自己的方法,像這樣:http://stackoverflow.com/questions/4521905/how-to-compare-associative-arrays-in-powershell –