swa*_*eck 1 arrays powershell multidimensional-array
我正在尝试使用 PowerShell (5.0) 划分工作块,并且很难实例化多维数组。
$n = 456;
$MaxChunks = 6;
$Chunks = @();
for($x = 0; $x -lt $MaxChunks; $x++)
{
Write-Host "Creating chunk $x"
$Chunks += @();
}
Run Code Online (Sandbox Code Playgroud)
$Chunks.Count总是返回 0 并且我无法通过索引访问 $Chunks 中的任何内容(即为$Chunks[0]空)。
最终,我的目标是访问位于 的数组并向其$Chunks[$i]添加多个System.Data.DataRow对象。但是,正如我所说,我无法访问该索引处的数组,因为该数组从未被实例化。
或者:
[System.Array] $chunks = [System.Array]::CreateInstance( [Int32], 3, 3 );
$chunks[0,0];
0
Run Code Online (Sandbox Code Playgroud)
不是原生PS,但有效。
复制一个空数组。
每个元素中都引用了相同的对象,但在这种特殊情况下,这不是问题,因为标准数组是只读的,并且在通过+=.
$Chunks = ,@() * $MaxChunks
Run Code Online (Sandbox Code Playgroud)收集 foreach 输出:
$Chunks = @(foreach ($x in 1..$MaxChunks) { ,@() })
Run Code Online (Sandbox Code Playgroud)
当 $MaxChunks = 1 时,外部 @() 处理理论上可能的情况。
您可以使用更详细(可能更慢)的 Write-Output -NoEnumerate:
$Chunks = @(foreach ($x in 1..$MaxChunks) { echo -NoEnumerate @() })
Run Code Online (Sandbox Code Playgroud)如果子数组将被大量修改,请使用 ArrayList 而不是+=:
$Chunks = @(foreach ($x in 1..$MaxChunks) { ,[Collections.ArrayList]@() })
Run Code Online (Sandbox Code Playgroud)
然后:
$Chunks[0].Add($something) >$null
Run Code Online (Sandbox Code Playgroud)PS不使用+=以从头产生整个阵列不论其大小的,因为它是一种可怕的方法,再现和各时间整个阵列副本; 通过循环语句(例如 foreach、for、while)有一个更快、更简单的输出集合;ArrayList 对象用于频繁非顺序修改数组的情况。