我仍然是PowerShell的新手,我正在尝试创建一些编织在一起的函数来创建和管理数组。我在使其中一个功能按预期工作时遇到了一些问题。
我需要第二个函数(AddToArray)将元素添加到指定的索引。没有任何现有元素可以被覆盖或删除。
例如,如果我有一个带有四个索引的数组并且都具有值5并且我调用函数AddToArray 2 4.我需要在第三个索引中写入函数并将现有的函数向下移动一步,所以数组现在看起来像这样:
5
5
4
5
5
到目前为止,这是我的代码,它显示了我的CreateArray函数和AddToArray函数的小代码片段。我现在已经尝试了一段时间,但我无法看到解决方案。
function CreateArray($Item1, $Item2)
{
$arr = New-Object Array[] $Item1;
# Kontrollerar om $Item2 har fått någon input och skriver in det i arrayen
if ($Item2)
{
for($i = 0; $i -lt $arr.length; $i++)
{
$arr[$i] = $Item2;
}
}
# Standard värde på arrayens index om inget värde anges vid funktionens anrop
else
{
$Item2 = "Hej $env:username och välkommen till vårat script!";
for($i = 0; $i -lt $arr.length; $i++)
{
$arr[$i] = $Item2;
}
}
$script:MainArray = $arr;
}
function AddToArray ($index, $add)
{
$MainArray[$index] = $add;
}
答案 0 :(得分:4)
.NET中的数组不直接支持插入,它们通常是固定大小的。 PowerShell确实允许简单的数组大小调整,但是如果数组变大并且你追加(导致调整大小)很多,性能可能会很差。
一种简单的方法就是从你的作品中创建一个新的数组,例如:
if ($index -eq 0) {
$MainArray = $add,$MainArray
}
elseif ($index -eq $MainArray.Count - 1) {
$MainArray += $add
}
else {
$MainArray = $MainArray[0..($index-1)], $add, $MainArray[$index..($MainArray.Length-1)]
}
但这是一种呕吐。我会使用List来支持插入,并且比数组更有效。
$list = new-object 'System.Collections.Generic.List[object]'
$list.AddRange((1,2,3,4,5))
$list.Insert(2,10)
$list
如果你真的需要一个数组,那么当你完成操作列表时,请调用$list.ToArray()
方法。
答案 1 :(得分:0)
数组没有.insert()方法,但是集合有.insert()方法。从数组生成集合的简单方法是使用scriptblock的.invoke()方法:
$array = 5,5,4,5,5
$collection = {$array}.invoke()
$collection
$collection.GetType()
5
5
4
5
5
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Collection`1 System.Object
现在,您可以使用.insert()方法在任意索引处插入元素:
$collection.Insert(2,3)
$collection
5
5
3
4
5
5
如果你需要它再次成为一个数组,将它转换回数组的简单方法是使用管道:
$collection | set-variable array
$array
$array.GetType()
5
5
3
4
5
5
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array