【问题标题】:Lookup table with compound key带有复合键的查找表
【发布时间】:2016-04-21 02:16:13
【问题描述】:

我正在寻找 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)]
}

有谁知道更优雅的方法来实现这一点?

【问题讨论】:

标签: powershell


【解决方案1】:

如果您想使用 Hashtables,那么您可以覆盖 Equals 方法并提供您自己的相等定义。检查此问题以了解如何执行此操作:How to overload the PowerShell inbuilt class's methods

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 2016-09-16
    • 2012-03-13
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多