下面的代码段从文件列表中检测哪些文件是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中的最后一行?
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在两种情况下抛出异常:
如果您确实想要这种行为,则需要一些额外的保护代码。
qvtsj1bj2#
正如罗伯特·格罗夫斯所说,选择对象第一次出现的技巧,你也可以使用最后一次出现。顺便说一句,像其他静态.Net方法一样,你可以在powershell中使用linq。
[Linq.Enumerable]::First($list) [Linq.Enumerable]::Distinct($list) [Linq.Enumerable]::Where($list, [Func[int,bool]]{ param($item) $item -gt 1 })
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
q5lcpyga4#
有一种原生方法可以实现这一点,方法是使用Powershell数组的Where函数,传入一个**WhereOperatorSelectionMode**,如下所示:
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|返回两个元素的数组|
Default
0
First
1
Last
2
SkipUntil
3
Until
Split
5
另请参阅:Checking Out The Where and ForEach Operators in PowerShell V4
92vpleto5#
这是一个非常简单的First实现:
function First($collection) { foreach ($item in $collection) { return $item } return $null }
您可以抛出InvalidOperationException异常,而不是返回$null。
InvalidOperationException
$null
5条答案
按热度按时间des4xlb01#
像这样的事...
最后一行的这些版本都将完成相同的任务:
有人指出,上述行为与Linq.First的行为并不完全相同,因为Linq.First在两种情况下抛出异常:
如果您确实想要这种行为,则需要一些额外的保护代码。
qvtsj1bj2#
正如罗伯特·格罗夫斯所说,选择对象第一次出现的技巧,你也可以使用最后一次出现。
顺便说一句,像其他静态.Net方法一样,你可以在powershell中使用linq。
dl5txlt93#
Doug Finke制作了一个关于将C#转换为Powershell http://dougfinke.com/video/CSharpToPowerShell.html的很棒的视频(只有7分钟
Roberts的例子确实非常好,尽管逗号分隔将被隐式地视为数组
最快捷的方法是将所有这些都放到一个管道中:
q5lcpyga4#
有一种原生方法可以实现这一点,方法是使用Powershell数组的Where函数,传入一个**
WhereOperatorSelectionMode
**,如下所示:您也可以直接从枚举使用模式:
使用
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
92vpleto5#
这是一个非常简单的
First
实现:您可以抛出
InvalidOperationException
异常,而不是返回$null
。