在 ArrayList 中搜索对象的最优化方法

Most optimized way to search for an Object in an ArrayList

我有一个 IP 列表(列表“X”),我正试图为其查找域名。 我还有一个 Excel 文件,其中包含 170 000 多个具有相应域名的 IP 条目。

所以我首先导入 Excel 文件: $dnsEntries = Import-Excel -Path '.\file.xlsx' -WorksheetName "list"

然后对于列表“X”中的每个 IP,我尝试在 $dnsEntries 中找到它,这样我就可以获得域名:

foreach($IP in $IPs) {
    $DN=($dnsEntries.Where({$_."Address" -like $IP})).Name
}

不幸的是,每个IP至少需要2秒,而我有5000+,所以这需要很长时间。困扰我的是 Excel 可以用一个简单的公式在不到 3 秒的时间内找到所有 5000+ 对应的域名。我知道我永远无法与 PowerShell 如此接近,但差异怎么会这么大?

有什么方法可以加快搜索速度吗?

提前致谢!

编辑:这是一个可重现的例子。某些 IP 将无法匹配。

$IPs = @("10.10.10.1","10.10.10.5","10.10.10.66","10.10.10.99","10.10.10.235","10.10.10.73","10.10.10.98","10.10.10.56")
$dnsEntries = @(
    @{Address="10.10.10.73";Name="ip1.local"},
    @{Address="10.10.10.98";Name="ip2.local"},
    @{Address="10.10.10.1";Name="ip3.local"},
    @{Address="10.10.10.56";Name="ip4.local"},
    @{Address="10.10.10.235";Name="ip5.local"},
    @{Address="10.10.10.5";Name="ip6.local"},
    @{Address="10.10.10.11";Name="ip7.local"},
    @{Address="10.10.10.81";Name="ip8.local"},
    @{Address="10.10.10.2";Name="ip9.local"}
)

foreach($IP in $IPs) {
    $DN=($dnsEntries.Where({$_."Address" -like $IP})).Name
    Write-Host $DN
}

如其中一条评论所述,我使用以下代码将 $dnsEntries 从 ArrayList 转换为 Hashtable:

$import = Import-Excel -Path '.\file.xlsx' -WorksheetName "list"
$dnsEntries = @{}

foreach($entry in $import){
    $dnsEntries.Add($entry.Address,$entry.Name)
}

foreach($IP in $IPs) {
    $DN=$dnsEntries[$IP]
    Write-Host $DN
}

转换还是需要很长时间,但是找域名换IP几乎是瞬间!所以最终还是节省了很多时间。

感谢大家的建议!