在数组中指定索引位置添加元素。PowerShell

6
我刚接触Powershell,正在尝试编写几个函数。我已经创建了一个从输入中创建数组的函数。我还尝试创建一个在指定索引处添加元素的函数,而不使用列表(我知道列表更容易,但我想理解如何在没有列表的情况下完成它)。
这是我的代码。我无法让它工作,我尝试了循环和下面的代码,请帮忙看看。
祝好!
Function Create_array ($index, $value)
{
$array = new-object array[] $index
if ($value)
{
    for ($i = 0;$i -lt $array.length;$i++)
    {
        $array[$i] = $value
    }
    write-host ""
    write-host "Grattis!! Din array är nu skapad med angivet index och värde."
}
else
{
    for ($i = 0;$i -lt $array.length;$i++)
    {
        $array[$i] = "Hej $env:username och välkommen till Dennis och Jonas script. Detta är en defaulttext, ange ett eget index följt av önskat värde"
    }
    write-host ""
    write-host "Array är nu skapad med defaultvärden"
}
return $array
}


Function Add_to_array ($nyarray, $value, $index) # Lägger till ett värde på angivet index eller längst ner om index ej anges.
{
if ($index -gt $nyarray.length)
{
    $i = $nyarray.length
    write-host "Du har angivit ett felaktigt index. Din array innehåller $i element"
}
elseif ($index -gt 2) # Kollar om det angivna indexet är större än 2
{
    $nyarray[$index - 2] += $värde # Om större än 2: Angivna värdet läggs in på angivet index ($index - 2)
    write-host "Element är nu inlagt på angivet index i din array"
}                      # och resten flyttas ner.
elseif ($index -eq 1) # Kollar om angivet index är mindre än 2
{
    $nyarray[0] += $värde # Om mindre sätts det angivna värdet in på index 1 (0)
    write-host "Element är nu inlagt på angivet index i din array"
}
else
{
    $nyarray += $värde # Om inget index anges sätter denna funktion in det angivna värdet längst ner.
    write-host "Element är nu inlagt längst ner i din array"
}
return $nyarray # Lägger in den "nya" arrayen i det variabelnamn man valt.
}

可能是Powershell向数组添加元素的函数的重复问题。 - Keith Hill
5个回答

5
如果我们需要平坦的数组结果,我们可以使用sum运算符:
下面的代码将在$array1的第4个位置添加[string]'Word'。
$new_array = @($array1[0..3]) + @('Word') + @($array1[4..5])

使用情景是将两个扁平数组连接在一起,或者在固定数组的某个位置添加一些数据。


3
这是我如何管理它的方式。封装成一个函数。但是,如果你的数组值非常长,可能会遇到问题。
$myArray = @("how","to","slice","into","an","array")

Function Insert-ToArray($Array, $insertAfter, $valueToInsert){
#find the index of value before insertion
$insertPoint = $Array.IndexOf($insertAfter)
#split the array into two parts
$firstHalf = $Array[0..$insertPoint]
$secondHalf = $Array[($insertPoint +1)..$Array.Length]
#slice into a new array
$newArray = @($firstHalf,$valueToInsert,$secondHalf)
return $newArray
#returning this new array means you can assign it over the old array
}

$myArray = Insert-ToArray -Array $myArray -insertAfter "slice" -valueToInsert "something"

$myArray

1

你可以使用数组切片来完成:

$array = @(1,2,4,5)
$value = 3
$index  = 2

$array = $array[0..($index -1)] + $value + $array[$index..($array.Length -1)]

$array

5
这个数组构建的方式可能和你想象的不一样。$array = $array[0..($index -1)] + $value + $array[$index..($array.Length -1)] - lit
1
你和你的逗号浪费了我一个小时。你能修复它们吗?或者管理员可以做到吗?我感谢你的回答,但是它是错误的。`$array = @(1,2,4,5) $value = 3 $index = 2$array = $array[0..($index -1)],$value,$array[$index..($array.Length -1)]$array
$array.count 3`
你创建了3个数组。
- Jamin

1
作为你声称想了解如何在没有列表的情况下工作的助手,我将解释一下数组的内部工作原理。这种数据操作主要出现在低级编程中,例如数据结构课程和C编程。高级语言(如Java、C#和Powershell)确实使用这些技术,但实际的实现对用户来说是隐藏的。尽管如此,运行时仍会执行类似于以下步骤的操作。
作为基本数据结构的数组实际上不支持插入。数组仅支持读取和写入操作。将数组视为一个方格数学纸张,其中每个数组单元格都是纸张上的方格。在纸张上写一些文本(管道符号说明方格,数字表示索引):
 0 1 2 3 4 5 6 7
|t|s|t| |t|e|x|t|

现在考虑将缺失的字母e插入到单词tst中,使其变为test。会发生什么?需要一个新的数组:
 0 1 2 3 4 5 6 7 8
|t|e|s|t| |t|e|x|t|

请注意,在将e插入第二个单元格后,所有剩余的字母都向前移动了一步。那么发生了什么?你手动执行的插入程序如下:
  1. 将原始数组中的项目复制到新数组中,直到读取索引为插入索引
  2. 在插入索引处将插入字符添加到新数组中
  3. 将原始数组中的项目复制到新数组中。插入索引比读取索引多1个
正如您所看到的,这个过程有点繁琐。当在纸上"插入"一个字母时,您不会在原始数组中创建新的空单元格。您必须手动复制所有元素。
作为全新数组的替代方案,您可以通过添加额外的单元格来调整数组大小。然后,您可以从数组末尾开始,将字母向前移动一步,直到达到插入索引。然后添加插入的字母并停止。因此,
 0 1 2 3 4 5 6 7 8
|t|s|t| |t|e|x|t| | # start
|t|s|t| |t|e|x|t|t| # moved last t to the end
|t|s|t| |t|e|x|x|t| # overwrite old t with x
|t|s|t| |t|e|e|x|t| # overwrite old x with e
|t|s|t| |t|t|e|x|t| # and so on
|t|s|t| | |t|e|x|t|
|t|s|t|t| |t|e|x|t|
|t|s|s|t| |t|e|x|t| # insert location reached after this
|t|e|s|t| |t|e|x|t| # don't overwrite s with t but e. Done!

现在您已经了解了数组插入的工作原理,mjolinor的示例就很容易理解了。通过从起始点到插入点复制元素,添加插入并复制其余数组内容来创建新数组。


0
Function InsertToArray($Array, $insertIndex, $valueToInsert){
    return @(
        for ($i = 0; $i -lt $insertIndex; $i++) {
            $Array[$i]
        }
        $valueToInsert
        for ($i = $insertIndex; $i -lt $Array.Length; $i++) {
            $Array[$i]
        }
    )
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接