前回のPowerShell で 2つのシーケンスから1つのシーケンスを生成したい(1)から続きです。
いろいろもにょっていたのですが、LINQ星人から、オリジナルのZipのコードを参考にしたらどうかといわれて、シンプルになったので公開します。
コード
GitHubに置いておきます。
何ができるの
- -resultSelectorで
$first,$secondを使ってシーケンス操作を指定、出力するようにした - もし指定しない場合は、従来通りタプル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)
まとめ
たのしいです。いろいろ公開したらブラッシュアップされる予感。