在数组中的指定索引位置添加元素。电源外壳

时间:2013-11-13 13:26:03

标签: arrays function powershell

我是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.
}

4 个答案:

答案 0 :(得分:3)

您可以使用数组切片来执行此操作:

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

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

$array

答案 1 :(得分:2)

这就是我的管理方式。包装成一个函数。虽然您可能有问题。如果您的数组值很长。

$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

答案 2 :(得分:1)

正如您声称的那样,您正试图了解如何在没有List的情况下工作,我将解释数组如何在幕后工作。这种数据操作主要在低级编程中遇到,如数据结构类和C编程。 Java,C#和Powershell等高级语言确实采用了这些技术,但实际的实现对用户来说是隐藏的。尽管如此,运行时还是做了类似这些步骤的事情。

作为基本数据结构的数组实际上不支持插入。 Array仅支持读写操作。将数组视为平方数学论文,其中每个数组单元格都是纸上的正方形。在论文中写一些文字(管道字符表示正方形,数字是索引):

 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. 将原始数组中的项目复制到新数组中。插入索引 是一个比阅读索引更多的
  4. 正如您所看到的,这个过程有点古怪。在纸张上“插入”字母时,不会在原始数组中创建新的空单元格。您必须手动复制所有元素。

    作为全新阵列的替代方案,您可以通过在其中添加额外的单元格来调整阵列的大小。然后,不是将字母复制到新数组,而是从数组的末尾开始,然后将字母向前一步复制到插入索引。然后添加插入的字母并停止。所以,

     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的示例很容易理解。通过从开始到插入点复制元素,添加插入并复制其余数组内容来创建新数组。

答案 3 :(得分:1)

如果结果中需要平面数组,则可以使用sum运算符:

下面的代码在$ array1的位置4添加[string]'Word'

$new_array = @($array1[0..3]) + @('Word') + @($array1[4..5])

用例将两个平面数组连接在一起,或在固定数组的某个位置添加一些数据。