什么是PowerShell中的Linq.First等价物?

rus*_*der 39 c# linq powershell lambda

下面的代码片段从文件列表中检测到哪些文件是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));
Run Code Online (Sandbox Code Playgroud)

我如何在PowerShell中转换最后一行?

Rob*_*ves 60

像这样......

$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
Run Code Online (Sandbox Code Playgroud)

最后一行的这些版本都将完成相同的操作:

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

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

$dir = $files | Where { $line.EndsWith($_) } | Select -First 1
Run Code Online (Sandbox Code Playgroud)

  • 对于任何想知道的人,`{{}} | 选择-First`做"短路".也就是说,如果您在上面的示例中搜索了一百万个文件,并且在说出10个文件之后找到了匹配项,那么结果将立即返回.PowerShell不会搜索剩余的文件. (9认同)

fre*_*nde 5

正如罗伯特·格罗夫斯(Robert Groves)所说,“选择对象-第一次出现”可以解决问题,您还可以使用-“最后一次出现”。

顺便说一句,就像其他任何静态.Net方法一样,您可以在Powershell中使用linq。

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

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

[Linq.Enumerable]::Where($list, [Func[int,bool]]{ param($item) $item -gt 1 })
Run Code Online (Sandbox Code Playgroud)