tech.guitarrapc.cóm

Technical updates

PowerShell で 2つのシーケンスから1つのシーケンスを生成したい(2)

前回のPowerShell で 2つのシーケンスから1つのシーケンスを生成したい(1) から続きです。

いろいろもにょっていたのですが、LINQ星人 から、オリジナルのZipのコードを参考にしたらどうかといわれて、シンプルになったので公開します。

目次

コード

GitHub に置いておきます。

何ができるの

  • -resultSelector で、 $first, $second を使ってシーケンス操作を指定、出力するようにしました
  • もし指定しない場合は、従来通り tuple した1つのシーケンスを出力します
  • パイプライン入力とパラメータ入力の両方に対応しています

-resultSelector を使う

パイプライン入力

パイプライアンから$first として入力した 1..10 のint配列を、$second に指定した 100..3 のint配列に対して、-resultSelector で指定したように 文字列で結合しています。

$first = 1..10
$second = 100..3
$first | New-zip -second $second -resultSelector {"$first : $second"}
1 : 100
2 : 99
3 : 98
4 : 97
5 : 96
6 : 95
7 : 94
8 : 93
9 : 92
10 : 91

-resultSelector を入力しない場合は、Tuple して各要素をペアにした1つのシーケンスとして出力します。

$first = 1..10
$second = 100..3
$first | New-zip -second $second
Item1 Item2
----- -----
    1   100
    2    99
    3    98
    4    97
    5    96
    6    95
    7    94
    8    93
    9    92
   10    91
パラメータ入力

パイプライン入力と同様です。

$first = 1, 2, 3, 4
$second = "hoge", "moge", "fuga", "piyo"
New-Zip -first $first -second $second -resultSelector {"$first : $second"}

入力される型にかかわらず、そのまま型情報は維持してシーケンスで処理できます。

$first = ps
$second = ls
New-Zip -first $first -second $second -resultSelector {"$first : $second"}

プロパティも指定可能です。

$first = ps
$second = ls
New-Zip -first $first -second $second -resultSelector {"{0} : {1}" -f $first.id, $second.fullname}

基本的な考え方

基本は、この動作を元に考えています。


function hoge 
{
    param(
        [parameter(valuefromPipeline)]
        [PSObject]
        $hoge, 
        [PSObject[]]
        $fuga
    )
    begin
    {
        $e2 = @($fuga).GetEnumerator()
    }
    process
    {
        $e2.MoveNext() > $null
        $hoge
        $e2.current | gm
    }
}

1..10 | hoge -fuga ྪ..1)

まとめ

たのしいですにぇ。いろいろ公開したらブラッシュアップされる予感。