Powershell 具有复合键的查找表
我正在PowerShell中寻找高效的查找表 朴素的方法对于大数据来说是无效的Powershell 具有复合键的查找表,powershell,Powershell,我正在PowerShell中寻找高效的查找表 朴素的方法对于大数据来说是无效的 $data = ` @( @{ A = 1; B = 2; C = 3; }, @{ A = 4; B = 5; C = 6; }, @{ A = 7;
$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
> [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)]
}
有人知道更优雅的实现方法吗?如果您想使用哈希表,那么您可以覆盖Equals方法并提供您自己的相等定义。检查如何执行此操作的问题:Tuple应该可以正常工作。如果出于任何原因只想使用哈希表,则可以实现自己的方法,如下所示: