PowerShell で、C# の LINQ 相当の書き方?
件名の件ですが、どうやら Select() 拡張メソッド相当の命令は Select-Object ではなく ForEach-Object の模様?です。Select-Object は何かのクラスに属するプロパティメンバーのうち、表示したいプロパティメンバーのみにフィルタする、または、任意のクラス、または匿名クラス型メンバーとして作成し直す。という時に使うんでしょうかね?
流れてきたデータを、クラスに属さずにそのまま加工して返す。という場合は ForEach-Object なのかな?
C# で書く版
var items = Enumerable.Range(1, 10).Where(x => x % 2 == 0).Select(x => x * 2);
PowerShell で書く版
# うまくいかない・・・ $items = 1..10 | Where-Object { $_ % 2 -eq 0 } | Select-Object { $_ * 2 } foreach ($item in $items) { # Write-Host $item # @{ $_ * 2 =4} # Write-Host $item.GetType() # System.Management.Automation.PSCustomObject Write-Host $item.' $_ * 2 ' # インテリセンスに出てきたメンバー } # 辞書型の Value1 メンバーに閉じ込めて、扱う? $items = 1..10 | Where-Object { $_ % 2 -eq 0 } | Select-Object @{ Name = "Value1"; Expression = { $_ * 2 } } foreach ($item in $items) { # Write-Host $item # @{Value1=4} # Write-Host $item.GetType() # System.Management.Automation.PSCustomObject Write-Host $item.Value1 } # やりたかったことみたい(C# の LINQ 的なの) $items = 1..10 | Where-Object { $_ % 2 -eq 0 } | ForEach-Object { $_ * 2 } foreach ($item in $items) { Write-Host $item }
出力結果
4 8 12 16 20
当初は、List ジェネリック型なのかな?と思っていましたが、PowerShell の世界だとわざわざ使うものでもないのかなと思ったり思わなかったり。使えばちゃんと型チェックしてくれますし。ただキャストが面倒くさいのは、何か別案があるのかな?
using namespace System.Collections.Generic $items = New-Object List[int] $items.AddRange([int[]]@(1..10)) # $items.Add("aa") # "Add" の引数 "item" (値 "aa") を型 "System.Int32" に変換できません: "値 "aa" を型 "System.Int32" に変換できません。エラー: "入力文字列の形式が正しくありません。"" $items2 = $items | Where-Object { $_ % 2 -eq 0 } | ForEach-Object { $_ * 2 } foreach ($item in $items2) { Write-Host $item }