什么是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 } 

您可以抛出InvalidOperationExceptionexception,而不是返回$null