Arrays 使用Powershell使用.Add()问题并填充ArrayList

Arrays 使用Powershell使用.Add()问题并填充ArrayList,arrays,powershell,Arrays,Powershell,我试图为一个包含超过10000个条目的数据数组的脚本添加性能,然后在foreach object语句中使用它,通过调用另一个函数用新数据填充空白的ArrayList。我一直在阅读如何不使用+=,这也是我学习的方法,因为它会破坏阵列并为每个项目重建阵列,因此性能非常糟糕。 我遇到的问题是我需要调用一个函数来填充一个空的ArrayList,但在.Add()方法中我似乎无法做到这一点 旧代码: Function get_gfe Function get_os $gfe = [System.Co

我试图为一个包含超过10000个条目的数据数组的脚本添加性能,然后在foreach object语句中使用它,通过调用另一个函数用新数据填充空白的ArrayList。我一直在阅读如何不使用+=,这也是我学习的方法,因为它会破坏阵列并为每个项目重建阵列,因此性能非常糟糕。 我遇到的问题是我需要调用一个函数来填充一个空的ArrayList,但在.Add()方法中我似乎无法做到这一点

旧代码:

Function get_gfe
Function get_os

$gfe   =  [System.Collections.ArrayList]@()
$gfe   = get_gfe
$getos = [System.Collections.ArrayList]@()

$gfe | foreach { $getos     += get_os $_} 
这需要一个多小时才能用数据填充$getos。 我希望用这样的东西来代替,但它不起作用,任何帮助都将不胜感激

$gfe | foreach { [void]$getos.Add(get_os $_)} 
我知道您可以使用.Add($\),但这不符合我的需要,而且我在.Add()方法中找不到使用其他代码或调用函数的任何引用


提前谢谢

为什么不将
foreach
-循环扩展为如下内容:

foreach ($entry in $gfe){
    $os = get_os $entry
    [void]$getos.add($os)
}
与管道输送到
foreach对象
相比,
foreach
循环也节省了时间


当然,因为我不知道你的函数实际上在做什么,这并不是节省时间的最有效的方法。您可以使用
measure命令

确定为什么不将
foreach
-循环扩展为如下内容:

foreach ($entry in $gfe){
    $os = get_os $entry
    [void]$getos.add($os)
}
与管道输送到
foreach对象
相比,
foreach
循环也节省了时间


当然,因为我不知道你的函数实际上在做什么,这并不是节省时间的最有效的方法。您可以使用
measure命令
确定
$getos
的类型是System.Collections.ArrayList而不是“普通”数组(System.Object[])是否是绝对重要的

如果没有,我认为下一个代码可以执行得更快:

$getos = foreach ($entry in $gfe) {
    get_os $entry  # output the result of function get_os and collect in variable $getos
}

$getos
的类型是System.Collections.ArrayList而不是“普通”数组(System.Object[]),这是否绝对重要

如果没有,我认为下一个代码可以执行得更快:

$getos = foreach ($entry in $gfe) {
    get_os $entry  # output the result of function get_os and collect in variable $getos
}

感谢大家的推荐,它们帮助我更好地理解了foreach、array和arrayLists。我们怀疑这种缓慢与foreach循环访问一个函数有关,该函数对每个序列号使用一个API。我们最近升级了MDM控制台并更换了底层硬件

感谢大家的推荐,他们帮助我更好地理解了foreach、array和arrayLists。我们怀疑这种缓慢与foreach循环访问一个函数有关,该函数对每个序列号使用一个API。我们最近升级了MDM控制台并更换了底层硬件

.Add(get_os$)
->
.Add((get_os$)
.Add(get_os$)
->
.Add((get_os$))
这一点都不重要,通常我会将数组创建为$getos=@()。我以前也像你写的那样写foreach语句,但我想我已经读到使用管道方法更快,在我的例子中,不是这样。实际上,你建议的方法不同,我现在正在尝试,请继续关注。@bdjenky我正在关注。。有什么要报告的吗?我已经尝试了上面提到的所有方法,都是使用measureobject命令。所有这些都是在50分钟的范围内完成的,这接近我使用常规阵列时的体验。这可能是因为我试图实现的目标已经“优化”。当使用适当的参数手动运行函数get_os时,显示数据所需的时间不到一秒钟,因此PS遍历所有序列号的循环并将其输入该函数的速度一定很慢。我不知所措。这一点都不重要,通常我会将数组创建为$getos=@()。我以前也像你写的那样写foreach语句,但我想我已经读到使用管道方法更快,在我的例子中,不是这样。实际上,你建议的方法不同,我现在正在尝试,请继续关注。@bdjenky我正在关注。。有什么要报告的吗?我已经尝试了上面提到的所有方法,都是使用measureobject命令。所有这些都是在50分钟的范围内完成的,这接近我使用常规阵列时的体验。这可能是因为我试图实现的目标已经“优化”。当使用适当的参数手动运行函数get_os时,显示数据所需的时间不到一秒钟,因此PS遍历所有序列号的循环并将其输入该函数的速度一定很慢。我不知所措。