我有两个包含用户详细信息的数组。
阵列 1
假设有大约 2000 个不同的用户,他们存在于“不同用户”数组中。不同的用户是一组用户对象,具有如下属性:
$userDetailsObject=@{
UserName = "UserName1"
UserEmail = "UserEmail1"
Category = "Category1"
}
阵列 2
第二个数组是属于多个组的所有用户的列表 - 名为“所有组用户”。因此可能存在重复用户,因为同一个用户可以是多个组的一部分。“所有组用户”数组没有用户的类别详细信息。该数组中有大约 12000 个对象。
$groupUserDetailsObject=@{
UserName = "UserName1"
UserEmail = "UserEmail1"
GroupName = "Group1"
Category = ""
}
我正在尝试使用类别获取组明智的用户详细信息,并且需要比较“所有组用户”数组和“不同用户”数组(基于唯一的电子邮件地址),并在“所有组用户”。
最快的方法是什么?我尝试了不同的组合,例如嵌套的 foreach 循环和正则表达式匹配,但无法大大加快速度,大约需要 20 秒才能遍历“不同用户”数组中的每个用户并更新“所有组”中的所有匹配对象用户”数组。
添加我用来测试的模拟代码:
$Users=[System.Collections.ArrayList]@()
$a = @(1..12000)
$i=0
#build 12000 sample users with 2000 unique users by adding sample values
foreach ($item in $a)
{
if($i -eq 2000) #reset pattern after every 200 users
{
$i=0
}
$userDetailsObject=@{
UserName = "UserName$i"
UserEmail = "UserEmail$i"
Category = ""
}
$obj = New-Object -Type PSObject -Prop $userDetailsObject
$Users.Add($obj)
$i++
}
#loop through 2000 unique users and compare by email address against 12000 users
for($i=0 ;$i -lt 2000 ;$i++)
{
[regex] $regex = '(?i)^('+[regex]::escape("UserEmail$i") + ')$'
Measure-Command {foreach($item in ($Users.where{$_.UserEmail -match $regex}))
{
$item.Category = "Category$i"
}
}| Select-Object -Property TotalSeconds
}
谢谢。