2

DataRow オブジェクトの大きな配列があります。配列内の各オブジェクトには 3 つのプロパティがあります。名、姓、および部門。一部のオブジェクトは、FirstName と LastName は同じですが、部門が異なります。重複がある場合、FirstName と LastName は何でもかまいませんが、オブジェクトの Department の 1 つが常に「Temp Employee」であり、もう 1 つは何でもかまいません。

FirstName/LastName に基づいてすべての重複オブジェクトを削除する必要がありますが、「一時従業員」部門ではない重複オブジェクトを保持するために重複が見つかった場合。

関数を作成しましたが、非常に時間がかかります。これを行うためのより良い方法が必要です。

function removeDupsFromSamData($aSamData) {
    $aNoDups = @();
    $aTemps = $aSamData | Where-Object { $_.Department -eq 'Temp Employee' } | % { "$($_.FirstName)|$($_.LastName)" }
    $aFtes = $aSamData | Where-Object { $_.Department -ne 'Temp Employee' } | % { "$($_.FirstName)|$($_.LastName)" }

    $aTempsAsFtes = Compare-Object $aTemps $aFtes | % { $_.InputObject }
    $aUniqueEmps = @();
    foreach ($i in $aTempsAsFtes) {
        $sTempFname = $i.Split('|')[0]
        $sTempLname = $i.Split('|')[1]
        $aUniqueEmps += $aSamData | ? { ($_.LastName -eq $sTempLname) -and ($_.FirstName -eq $sTempFname) }
    }##endforeach

    return $aUniqueEmps
}##endfunction
4

2 に答える 2

0

これはもっと速いかもしれないと思います。残念ながら、測定する大きなサンプルファイルはありません。

function removeDupsFromSamData($aSamData) {

    $aFtes = $aSamData | Where-Object { $_.Department -ne 'Temp Employee' }
    $aTemps = $aSamData | Where-Object { $_.Department -eq 'Temp Employee' }

    $new = @()
    Compare-Object -ReferenceObject $aFtes -DifferenceObject $aTemps  -Property FirstName, LastName -PassThru | Where-Object { 
        #Unique temp-employee
        $_.SideIndicator -eq "=>"
    } | % {
        #Add to "new" list
        $new += $_
    }

    #Add the unique temps
    $aFtes += $new
    $aFtes
}

可能であれば、以下でそれらを測定してください。違いがあるかどうかを確認するのは楽しいでしょう:

#Your function
Measure-Command -Expression { removeDupsFromSamData $myarr }

#Rename my solution to "newremove" or something
Measure-Command -Expression { newremove $myarr }
于 2013-02-25T22:30:46.620 に答える
0

これはもっと速いですか?

function removeDupsFromSamData($aSamData) {


$aTemps = $aSamData | Where-Object { $_.Department -eq 'Temp Employee' } 
$aFtes = $aSamData | Where-Object { $_.Department -ne 'Temp Employee' } 

$ht = @{}

 foreach ($aFte in $aFtes)
  {
   $ht[$aFte.firstname/$aFte.lastname] = $true
  }

 foreach ($aTemp in $aTemps)
  {
  if ($ht[$aTemp.firstname/$aTemp.lastname])
    {continue}

  else {$aFtes += $aTemp}
  }

  $aFtes
}
于 2013-02-25T22:11:58.510 に答える