我有一个脚本可以索引我们设备的信息。要存储和分析我创建的课程信息:
Add-Type @'
public class CPObject
{
public int id;
public string name;
public string displayname;
public string classname;
public string ip;
public string netmask;
public string ManagementServer;
}
'@
然后,当我运行脚本时,我一直计划通过以下函数通过对象类将名称转换为IP:
Function NameToIP {
Param([int]$id=0, [string]$name="")
$CPObject = $CPNetworkObjects | Where-Object { $_.id -eq $id -and $_.name -eq $name }
If($CPObject.count -eq 1){
$CPObject.ip
} else {
""
}
}
它有效,但它非常慢,因为$ CPNetworkObjects包含超过12 000个CPObject类型的元素。
我想加快速度。有没有办法索引数组以提高搜索效率,或者是尝试减少使用对象数量的唯一解决方案?
亲切的问候, 帕特里克
答案 0 :(得分:3)
如果id和name的任何给定组合是唯一的,您可以通过构建查找表来加快名称到IP的分辨率:
$NameToIP = @{}
Foreach ($Object in $Array) { $NameToIP["$($Object.id)_$($Object.Name)"] = $Object.ip }
Function NameToIP {
Param([int]$id=0, [string]$name="")
$NameToIP["$id_$name"]
}
答案 1 :(得分:1)
也许你可以使用pscustomobject而不是类? 搜索15000个简单对象的数组似乎不会太长:
PS>(1..15000) |%{
>>> $res+=new-object pscustomobject -property @{"id"=$_;name=(get-random)}
>>> }
PS> measure-command -expression {$res |?{$_.id -eq 14999 -and $_.name -eq 513658722}}
需要802ms
答案 2 :(得分:0)
有没有办法索引数组以提高搜索效率
首先,我对powershell一无所知,所以我无法给你代码样本。
如果id或name是唯一的,则应尝试从CPObject中删除此唯一字段并将其用作哈希映射的键,并将CPObject作为哈希表返回的值。
您应该尝试使用名称和/或ID对数组进行排序 在寻找名称
时,您可以从O(n)时间复杂度O(log(n))开始希望这有帮助,