2013-10-03 14 views
10

Po pierwsze, jestem programistą .NET i LOVE LINQ oraz metodami rozszerzenia w C#. Ale kiedy potrzebuję skryptów potrzebuję czegoś podobnego do Enumerable extension methodspowershell max/first/aggregate functions

Czy ktoś może mi dać jakąkolwiek sugestię/wyjaśnić najlepszą praktykę dotyczącą pracy w takich scenariuszach w Powershell. Na przykład załóżmy, że chcę wziąć max elementu z tablicy:

$arr = @(2, 1, 3) 
$max = $arr.MAX() #?? what should i do in this case? 

Odpowiedz

20

Użyj polecenia Measure-Object:

C:\PS> 2,1,3 | Measure-Object -Maximum 


Count : 3 
Average : 
Sum  : 
Maximum : 3 
Minimum : 
Property : 

lub uzyskać tylko max:

C:\PS> (2,1,3 | Measure -Max).Maximum 

Jest też minimalna , Średnia i Suma dostępne, jak widać powyżej. Ale musisz powiedzieć programowi PowerShell, aby obliczyć te z parametrami w Measure-Object, np. -Sum -Average itd.

9

Keith poprawnie wspomina ekwiwalenty PowerShella dla niektórych metod rozszerzenia LINQ. Zauważ, że możesz wywoływać większość metod rozszerzenia z PowerShell, po prostu nie możesz ich wywoływać tak, jakby były członkami.

Metody rozszerzeń są tak naprawdę tylko statycznymi metodami z dodatkowymi regułami w języku C#, aby umożliwić ich wywoływanie jak członków.

PowerShell nie implementuje żadnej z tych reguł, ale to nie powstrzymuje od wywoływania ich jako metod statycznych, np.

[System.Linq.Enumerable]::Average([int[]](1..10)) 
+0

co z metodami Func? Wszelkie ( \t to IEnumerable źródłowym \t Func orzecznik ) –

+0

możliwe, ale trochę bolesne, ponieważ typ odliczenie nie jest tak silny, jak to może być: [System.Linq.Enumerable]: : Any ([int []] @ (1..10), [System.Func [int, bool]] {$ args [0] -gt 5}) –

+0

Co powinienem zrobić w takich przypadkach? –

0

$ arr | foreach {if ($ max -lt $ _) {$ max = $ _}}; $ max