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

时间:2011-03-19 04:45:53

标签: 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));

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

4 个答案:

答案 0 :(得分:54)

像这样......

$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

答案 1 :(得分:5)

正如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 })

答案 2 :(得分:1)

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

答案 3 :(得分:-2)

这是First的一个非常简单的实现:

function First($collection)
{
    foreach ($item in $collection)
    {
        return $item
    }
    return $null
}

您可以抛出$null例外,而不是返回InvalidOperationException