以下の内容はhttps://tech.guitarrapc.com/entry/2014/08/21/100930より取得しました。


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

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

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

コード

GitHubに置いておきます。

guitarrapc / PowerShellUtil / LINQ / New-Zip.ps1

何ができるの

  • -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&#40
        [parameter&#40valuefromPipeline&#41]
        [PSObject]
        $hoge,
        [PSObject[]]
        $fuga
    &#41
    begin
    {
        $e2 = @&#40$fuga&#41.GetEnumerator&#40&#41
    }
    process
    {
        $e2.MoveNext&#40&#41 > $null
        $hoge
        $e2.current | gm
    }
}

1..10 | hoge -fuga &#4010..1&#41

まとめ

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




以上の内容はhttps://tech.guitarrapc.com/entry/2014/08/21/100930より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14