Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the Linq.First equivalent in PowerShell?

The snippet below detects from a list of files which of them is a Directory on Ftp

as C# it will be like below

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)); 

How I can transalte the last line in PowerShell ?

like image 201
ruslander Avatar asked Mar 19 '11 04:03

ruslander


2 Answers

Something like this...

$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 

These versions of the last line would all accomplish the same:

$dir = @($files | Where { $line.EndsWith($_) })[0]  $dir = $files | Where { $line.EndsWith($_) } | Select -index 0  $dir = $files | Where { $line.EndsWith($_) } | Select -First 1 

It was pointed out that the above is not exactly equivalent in behavior to Linq.First because Linq.First throws exceptions in two cases:

  • Throws ArgumentNullException when source or predicate is null.
  • Throws InvalidOperationException when source sequence is empty or no element satisfies the condition in predicate.

If you wanted that behavior exactly, you'd need some extra guard code.

like image 183
Robert Groves Avatar answered Sep 19 '22 05:09

Robert Groves


as Robert Groves said, Select-Object -First Occurence do the tricks, you can also use -Last Occurence.

by the way, like any other static .Net method you can use linq in powershell.

[Linq.Enumerable]::First($list)  [Linq.Enumerable]::Distinct($list)  [Linq.Enumerable]::Where($list, [Func[int,bool]]{ param($item) $item -gt 1 }) 
like image 32
freakydinde Avatar answered Sep 22 '22 05:09

freakydinde