我有一大堆DataRow对象。数组中的每个对象都有3个属性; FirstName,LastName和Department。某些对象具有相同的FirstName和LastName,但具有不同的Departments。如果有重复,FirstName和LastName可以是任何东西,但是对象的Department之一将始终是'Temp Employee'而另一个可能是任何东西。
我需要删除所有基于FirstName / LastName的重复对象,但是如果找到重复项,则保留不是'Temp Employee'部门的重复对象。
我创建了一个函数但需要很长时间。必须有更好的方法来做到这一点。
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
答案 0 :(得分: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
}
答案 1 :(得分: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 }