PowerShellで.NET FrameworkのジェネリックなListをためす。

八丘椿 コンピュータ
出典:国立国会図書館「NDLイメージバンク」 (https://rnavi.ndl.go.jp/imagebank/)

初めに

PowerShellの配列は要素を追加することが難しいのでC#などで使われるList<T>を試してみたいと思います。

Namespaceの指定

以下のサンプルは事前にネームスペースを指定した状態で実行しています。

using namespace System.Collections.Generic

文字列のList

Listの要素にstring(文字列)を指定してみます。

初期化

$strings = [List[string]]::new()

追加

$strings.Add("a")
$strings.Add("b")
$strings.Add("c")

PowerShellの配列では追加が出来ませんでした。

削除

$strings.RemoveAt(1)

追加と同様に削除も出来ませんでしたが、Listでは出来ました。

インデックスを指定し変更

$strings[1] = "C"

インデックスを指定し参照

Write-Host $strings[1]
# C

件数を取得

Write-Host $strings.Count
# 2

ForEach-Objectによるループ

$strings | ForEach-Object { Write-Host $_ }
# a
# C

Sort-Objectによる並べ替え(降順)

$strings | Sort-Object -Descending
# C
# a

インデックスに-1

Write-Host ("-1:{0}" -f $strings[-1])
# -1:C

末尾の要素

スライス

Write-Host $strings[0..1]
# a C

配列をクリア

$strings.Clear()
Write-Host $string.Count
# 0

PSCustomObjectのList

PowerShellで汎用的に使われるPSCustomObjectを要素にしたListを試します。

初期化

$objects = [List[PSCustomObject]]::new()

配列からListへ要素を追加

@([PSCustomObject]@{
    Name = "A"
    Value = 1
},
[PSCustomObject]@{
    Name = "B"
    Value = 2
},
[PSCustomObject]@{
    Name = "C"
    Value = 3
},[PSCustomObject]@{
    Name = "D"
    Value = 4
}) | % { $objects.Add($_)}

本当は初期化で実施したいのですが、方法を見つけられませんでした。

Select-Objectによる項目の追加

$objects | Select-Object -Property Name, Value, @{label = "Dobule";expression = {$_.Value * 2}}
#Name Value Dobule
#---- ----- ------
#A        1      2
#B        2      4
#C        3      6
#D        4      8

Selectなのに項目が増やせてしまいます。

Where-Objectによる絞り込み

$objects | Where-Object { $_.Value -lt 3 }
#Name Value
#---- -----
#A        1
#B        2

Sort-Objectによる並べ替え

$objects | Sort-Object -Property Value -Descending
#Name Value
#---- -----
#D        4
#C        3
#B        2
#A        1

最後に

PowerShellの配列と初期化の方法が異なるだけで、ほぼ同じ処理が出来ることが確認できました。

コメント