数据库结果集后的缓慢数组操作

Slow array operations after DB resultset

我需要帮助优化我的 PowerShell 脚本。

$sorted = @()
$firsttime = 0
$j = 0
$zaehler = $results.Count-1

for ($i=0; $i -le $results.Count-1; $i++) {
    $j = $i+1
    while ($results.GUID[$i] -eq $results.GUID[$j]) {
        $klassen = ""
        $rec = $results | where {$_.GUID -eq $results.GUID[$i]}

        if ($firsttime -eq 0 -or !$sorted.GUID.contains($rec[0].GUID)) {
            $firsttime = 1
            foreach ($item in $rec.Klasse) {
                if ($klassen -eq "") {
                    $klassen += $item
                } else {
                    if (!$klassen.Contains($item)) {
                        $klassen += "," + $item
                    }
                }
            }
            $rec[0].Klasse = $klassen
            $sorted += $rec[0]
        }
        $j = $j+1
    }
    Write-Host ($i/$zaehler).ToString("P") "von Schule" $schule
}
if (!$sorted) {
    $results
} else {
    $sorted
}

基本上在我的结果集中 ($results) 我得到了重复的教师行,唯一的区别是他们在 class ("Klasse/Klassen") 上课。 为了最小化输出,我检查第一个 GUID 是否与第二个相同,然后脚本将第二个 class 附加到第一个。所以 $sorted 数组只有一行,每个老师用逗号分隔的字符串显示所有 classes.

$results 的示例行:

@{
    GUID={1234567-1234-1234-1234-1234567}; 
    userrole=teacher;
    Vorname=Max;
    Nachname=Mustermann;
    Geburtstag=01.01.2000;
    Klasse=9A; 
    Schule=123456
}
@{
    GUID={1234567-1234-1234-1234-1234567};
    userrole=teacher;
    Vorname=Max;
    Nachname=Mustermann;
    Geburtstag=01.01.2000;
    Klasse=9B; 
    Schule=123456
}

$sorted[0] 的示例行:

@{
    GUID={1234567-1234-1234-1234-1234567};
    userrole=teacher;
    Vorname=Max;
    Nachname=Mustermann;
    Geburtstag=01.01.2000;
    Klasse=9A,9B,9C,5A;
    Schule=123456
}

排序过程(检查是否包含,foreach $item,添加到 $klassen)非常慢。

如果有任何优化脚本的想法,我将不胜感激。

也许这样的事情会奏效:

$results | ForEach-Object {
    New-Object -Type PSObject -Property $_
} | Group-Object GUID | ForEach-Object {
    $teacher = $_.Group
    $teacher | Select-Object -First 1 -Exclude Klasse -Property *, @{n='Klasse';e={
        $teacher | Select-Object -Expand Klasse
    }}
}

将您的哈希表转换为自定义对象,按 GUID 对它们进行分组,然后将原始 "Klasse" 属性 替换为包含该组中所有对象的值数组的新表,以及 select第一个结果。

如果 $results 已经是一个对象列表,您可以跳过第一个 ForEach-Object:

$results | Group-Object GUID | ForEach-Object {
    $teacher = $_.Group
    $teacher | Select-Object -First 1 -Exclude Klasse -Property *, @{n='Klasse';e={
        $teacher | Select-Object -Expand Klasse
    }}
}