在大型数组中搜索信息

Searching for info in large arrays

我有一个脚本可以索引我们设备的信息。为了存储和分析信息,我创建了一个 class:

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;
}
'@

然后,当我 运行 脚本时,我一直计划通过对象 class 来使用以下函数将名称转换为 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 包含超过 12000 个 CPObject 类型的元素。

我想加快速度。有什么方法可以索引数组以提高搜索效率,或者是尝试减少使用的对象数量的唯一解决方案?

亲切的问候, 帕特里克

也许您可以使用 pscustomobject 而不是 class? 搜索 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}} 

需要 802 毫秒

Is there any way to index an array to make the search more efficient

首先,我对powershell一无所知,所以无法提供代码示例。

如果你能改变你的数据结构

如果 id 或 name 是唯一的,您应该尝试从您的 CPObject 中删除这个唯一字段并将其用作哈希映射的键,并将您的 CPObject 作为哈希返回的值 table.

如果你不能改变你的数据结构

您应该尝试使用名称 and/or id 对您的数组进行排序 您可以从 O(n) 时间复杂度 O(log(n)) 寻找名称到

希望对您有所帮助,

如果 id 加名称的任何给定组合是唯一的,您可以通过构建查找来加快名称到 ip 的解析速度 table:

$NameToIP = @{}

Foreach ($Object in $Array) { $NameToIP["$($Object.id)_$($Object.Name)"] = $Object.ip }

Function NameToIP {

    Param([int]$id=0, [string]$name="")

    $NameToIP["$id_$name"]

 }