什么是PowerShell中的Linq.First等价物?
下面的代码片段从文件列表中检测到哪些文件是Ftp上的目录
作为C#,它将如下所示
var files = new List(){"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中转换最后一行?
这样的东西……
$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
正如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 })
Doug Finke制作了一个关于将C#转换为Powershell的精彩video(仅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
这是First
一个非常简单的实现:
function First($collection) { foreach ($item in $collection) { return $item } return $null }
您可以抛出InvalidOperationException
exception,而不是返回$null
。