具有重复项的 Powershell 组哈希数组

Powershell Group Array of Hashes with Duplicates

我有以下数据集[哈希数组]:

假设 ID 总是唯一的


$dataset = @(
    @{
        ID   = "1234567891"
        Code = "ABC1111"
    },
    @{
        ID   = "1234567892"
        Code = "ABC1111"
    },
    @{
        ID   = "1234567893"
        Code = "ABC1112"  
    },
    @{
        ID   = "1234567894"
        Code = "ABC1113"   
    },
    @{
        ID   = "1234567895"
        Code = "ABC1114"   
    },
    @{
        ID   = "1234567896"
        Code = "ABC1111"  
    }
)

我想做的是按 Code 键对以下数据集进行分组。

我已经尝试了多种方法,例如管道 Group-ByGroup-ObjectSort-Object,但我仍然没有得到我想要的结果。

我正在寻找的结果 return 是一个看起来像这样的哈希表 [或类似的东西]:

$groupedDataset = @{
    ABC1111 = @("1234567891","1234567892","1234567896")
    ABC1112 = @("1234567893")
    ABC1113 = @("1234567894")
    ABC1114 = @("1234567895")
}

将散列 tables 转换为 PSCustomObjects,将其分组,然后将其分配给新的散列 table:

$groupedDataset = @{}

$dataset |
    ForEach-Object { [PSCustomObject]$_ } |
    Group-Object -Property Code |
    ForEach-Object { $groupedDataset[$_.Name] = $_.Group.ID }

有关使用 [PSCustomObject] 从散列 tables 创建自定义对象的更多信息,请参阅 Get-Help about_Object_Creation

补充

没有严格要求提供自定义对象作为Group-Object的输入; [hashtable] 实例可以按原样使用,只要您使用 脚本块参数 访问要分组的条目(PSv3+ 语法):

$ht = @{}
$dataset | Group-Object { $_.Code } | ForEach-Object { $ht[$_.Name] = $_.Group.Id }

注意使用 { $_.Code } 代替 [-Property] Code;后者仅适用于真正的 properties(与哈希表条目相反;相反,然而,{ $_.Code } 在任何一种情况下都有效,尽管 Code,如果适用,是更快)。