首页 > 解决方案 > 如何使用数组对唯一数据进行分组

问题描述

$array =@("1234","2345","3456","5555")

$source = @("1234-abc","1234-xyz","1234-pqr","2345-abc","3456-xyz","5555")

$source | where {
$found=$false

foreach($arr in $array)

{
if($_.contains($arr))

{
$found=$true

$ID=$_

if($found -eq $true)

{

$value=$ID

$myID =@($myID)

$myID=$myID +$ID } } }}

==========================

我得到如下输出: 1234-abc 1234-xyz 1234-pqr 2345-abc 3456-xyz 5555

但我需要如下输出:应用程序 ID + 它的相关连接,以便我可以使用它的连接名称向应用程序所有者发送电子邮件。

1234

美国广播公司

xyz

pqr

我需要在这里调用电子邮件功能以使用连接名称向 1234 应用程序的所有者发送电子邮件

2345

美国广播公司

我需要在这里调用电子邮件功能以向 2345 应用程序的所有者发送电子邮件,连接名称为 3456

xyz

我需要在此处调用电子邮件功能以使用连接名称向 3456 应用程序的所有者发送电子邮件

我已经为它准备好了电子邮件功能,但很难一次获得详细信息,目前我正在根据应用程序连接发送电子邮件,即 3 封邮件,用于与同一所有者的 3 个连接

标签: arrayspowershell

解决方案


正如@JeffZeitlin 建议的那样,您可以使用这样的字典:

[string[]]$array =@("1234","2345","3456","5555")
[string[]]$source = @("1234-abc","1234-xyz","1234-pqr","2345-abc","3456-xyz","5555")
$datas = New-Object System.Collections.Generic.Dictionary"[string,string[]]"

foreach($a in $array){
    [string[]]$it = @()
    foreach($s in $source){
        if($s.Contains($a)){
            $it += $s.Split("-")[1] + ","
        }
    }
    $datas.Add($a, $it.Split(",", [System.StringSplitOptions]::RemoveEmptyEntries))
}

#display result

foreach ($key in $datas.Keys) { 
    Write-Host "Key: $key  $($datas[$key].Count) values -> $($datas[$key])" 
}
Write-Host "**********************"
Write-Host "Other way to display:"
foreach ($key in $datas.Keys) {
    Write-Host "Key: $key"
    foreach ($value in $datas[$Key]){
        Write-Host "$value" 
    }
    Write-Host "--------------------"
}

推荐阅读