2

我有一大堆 DataRow 对象。数组中的每个对象都有 3 个属性;名字、姓氏和部门。一些对象具有相同的 FirstName 和 LastName,但部门不同。如果有重复,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) {


$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 回答
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 回答