2012-05-08 9 views
6

Se uso generico elenco come questo:Come RemoveAll quando si utilizza elenco generico <T> in PowerShell

$foo = New-Object 'system.collections.generic.list[object]' 
$foo.Add((New-Object PSObject -Property @{ Name="Foo1"; })) 
$foo.Add((New-Object PSObject -Property @{ Name="Foo2"; })) 
$foo.Add((New-Object PSObject -Property @{ Name="foo3"; })) 

Come posso applicare il metodo RemoveAll() di List<T>? È possibile utilizzare i predicati? Come posso, ad esempio, rimuovere tutti gli elementi che iniziano con maiuscola "F"?

risposta

10

Penso che l'unico modo sia senza utilizzare System.Predicate che richiede delegati (mi dispiace, ma in realtà non riesco a capire come creare delegati anonimi in PowerShell) e utilizzare la clausola where-object.

Nel mio esempio riassegno il risultato alla stessa variabile $foo che deve essere inoltrata nuovamente a list<T>.

per evitare errori se count risultato è uno solo ha bisogno del '' per creare sempre un valore array

[system.collections.generic.list[object]]$foo = , ($foo | ? {$_.name -cnotmatch "^f" }) 

EDIT:

Dopo qualche prova ho trovato come l'uso lambda espressione utilizzando powershell scriptblock:

$foo.removeAll({ param($m) $m.name.startswith('F', $false , $null) }) 

Questo è il modo giusto con il metodo che deve System.Predicate in PowerShell

+0

un inferno che sembra brutto. Bene se funziona a chi importa, giusto? Grazie! – Agzam

+0

felice di aiutarti! –

+0

Scommetto che si potrebbe invocare il DLR in Powershell e costruire un metodo anonimo che potrebbe essere passato come lambda. Certamente non cercherò di scrivere quello, me stesso, però :). – Shibumi

3

Ecco un'altra opzione utilizzando scriptblocks (delegati anonimi):

$foo.RemoveAll({$args[0].Name -clike 'F*'}) 
0

Si scopre che volevo veramente il metodo .clear() piuttosto che RemoveAll. RemoveAll è richiesto solo se si desidera rimuovere un gruppo di elementi anziché tutti gli elementi nell'elenco.

Problemi correlati