如何基于Powershell中的两个属性快速从数组中获取对象

时间:2013-02-25 21:17:56

标签: powershell

我有一大堆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

2 个答案:

答案 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 }