web-dev-qa-db-ja.com

PowerShellでLinq.Firstに相当するものは何ですか?

以下のスニペットは、ファイルのリストからそれらのどれがFTP上のディレクトリであるかを検出します

c#としては以下のようになります

var files = new List<string>(){"App_Data", "bin", "Content"};
var line = "drwxr-xr-x 1 ftp ftp              0 Mar 18 22:41 App_Data"
var dir = files.First(x => line.EndsWith(x));

PowerShellの最後の行を変換するにはどうすればよいですか?

40
ruslander

このようなもの...

$files = @("App_Data", "bin", "Content")
$line = "drwxr-xr-x 1 ftp ftp              0 Mar 18 22:41 App_Data"
$dir = $files | Where { $line.EndsWith($_) } | Select -First 1

最後の行のこれらのバージョンはすべて同じことを達成します。

$dir = @($files | Where { $line.EndsWith($_) })[0]

$dir = $files | Where { $line.EndsWith($_) } | Select -index 0

$dir = $files | Where { $line.EndsWith($_) } | Select -First 1
66
Robert Groves

robert Grovesが言ったように、Select-Object -First Occurenceがトリックを実行しますが、-Last Occurenceも使用できます。

ちなみに、他の静的.Netメソッドと同様に、Powershellでlinqを使用できます。

[Linq.Enumerable]::First($list)

[Linq.Enumerable]::Distinct($list)

[Linq.Enumerable]::Where($list, [Func[int,bool]]{ param($item) $item -gt 1 })
5
freakydinde

Doug Finkeは、C#をPowershellに変換することについて素晴らしいビデオ(わずか7分)を作成しました http://dougfinke.com/video/CSharpToPowerShell.html

ロバーツの例は確かに非常に優れていますが、カンマ区切りは暗黙的に配列として扱われます

それを行う最も簡単な方法は、すべてを単一のパイプラインに入れることです:

$dir = "App_Data", "bin", "Content" | % { if("drwxr-xr-x 1 ftp ftp              0 Mar 18 22:41 App_Data".EndsWith($_)) { $_ } } | select -first 1
1
James