前回の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)
まとめ
たのしいですにぇ。いろいろ公開したらブラッシュアップされる予感。