3

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

4 回答 4

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
于 2019-08-05T20:17:38.917 回答
2

您可以使用数组切片来做到这一点:

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

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

$array
于 2013-11-13T13:38:25.647 回答
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. 将原始数组中的项目复制到新数组中。插入索引比读取索引大一

如您所见,该过程有点繁琐。在纸上“插入”一个字母时,您不会在原始数组中创建新的空单元格。您必须手动复制所有元素。

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

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

于 2013-11-13T14:41:56.713 回答
1

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

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

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

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

于 2020-01-27T11:58:08.667 回答