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

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 などの高水準言語はこれらの手法を採用していますが、実際の実装はユーザーから隠されています。それでも、ランタイムはこれらのステップに似た何かを行います。

基本的なデータ構造としての配列は、実際には挿入をサポートしていません。配列は、読み取り操作と書き込み操作のみをサポートします。配列は、各配列セルが紙上の四角形である正方形の数学用紙と考えてください。紙にテキストを書きます (パイプ文字は正方形を示し、数字はインデックスです):

 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|

e2番目のセルに挿入した後、残りのすべての文字が1ステップ前に移動することに注意してください。どうしたの?手作業での挿入ルーチンはこんな感じで、

  1. 読み取りインデックスが挿入インデックスになるまで、元の配列から新しい配列にアイテムをコピーします
  2. 挿入インデックスで挿入された文字を新しい配列に追加します
  3. 元の配列から新しい配列にアイテムをコピーします。挿入インデックスは読み取りインデックスより 1 つ大きい

ご覧のとおり、このプロセスは少し面倒です。紙に文字を「挿入」するとき、元の配列に新しい空のセルを作成しません。すべての要素を手動でコピーする必要があります。

新しい配列の代わりに、余分なセルを追加して配列のサイズを変更できます。次に、文字を新しい配列にコピーする代わりに、配列の最後から始めて、挿入インデックスまで文字を 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 の例は簡単に理解できます。開始点から挿入点まで要素をコピーし、挿入を追加して残りの配列内容をコピーすることにより、新しい配列が作成されます。

于 2013-11-13T14:41:56.713 に答える
1

結果にフラット配列が必要な場合は、合計演算子を使用できます。

次のコード[string]'Word'は $array1 の位置 4 に追加しています

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

ユースケースは、2 つのフラット配列を連結するか、固定配列のある位置にデータを追加することです。

于 2020-01-27T11:58:08.667 に答える