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

cmssoen2  于 2023-01-18  发布在  Shell
关注(0)|答案(5)|浏览(176)

下面的代码段从文件列表中检测哪些文件是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中的最后一行?

des4xlb0

des4xlb01#

像这样的事...

$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

有人指出,上述行为与Linq.First的行为并不完全相同,因为Linq.First在两种情况下抛出异常:

  • 当源或 predicate 为空时引发ArgumentNullException。
  • 当源序列为空或没有元素满足 predicate 中的条件时引发InvalidOperationException。

如果您确实想要这种行为,则需要一些额外的保护代码。

qvtsj1bj

qvtsj1bj2#

正如罗伯特·格罗夫斯所说,选择对象第一次出现的技巧,你也可以使用最后一次出现。
顺便说一句,像其他静态.Net方法一样,你可以在powershell中使用linq。

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

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

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

dl5txlt93#

Doug Finke制作了一个关于将C#转换为Powershell http://dougfinke.com/video/CSharpToPowerShell.html的很棒的视频(只有7分钟
Roberts的例子确实非常好,尽管逗号分隔将被隐式地视为数组
最快捷的方法是将所有这些都放到一个管道中:

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

q5lcpyga4#

有一种原生方法可以实现这一点,方法是使用Powershell数组的Where函数,传入一个**WhereOperatorSelectionMode**,如下所示:

(1..9).Where({ $_ -gt 3}, "First") # 4

您也可以直接从枚举使用模式:

$mode = [System.Management.Automation.WhereOperatorSelectionMode]::First
(1..9).Where({ $_ -gt 3}, $mode) # 4

使用WhereOperatorSelectionMode enum中的任意值
| 姓名|瓦尔|说明|
| - ------|- ------|- ------|
| Default|0|返回所有项目|
| First|1|返回第一个项目|
| Last|2|返回最后一项|
| SkipUntil|3|跳过项目直到条件为真|
| Until|x1米11米1x|返回所有项,直到条件为真|
| Split|5|返回两个元素的数组|

另请参阅Checking Out The Where and ForEach Operators in PowerShell V4

92vpleto

92vpleto5#

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

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

您可以抛出InvalidOperationException异常,而不是返回$null

相关问题