7

次のような一般的なリストを使用する場合:

$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"; }))

の RemoveAll() メソッドを適用するにはどうすればよいList<T>ですか? 述語を使用することは可能ですか? たとえば、大文字の「F」で始まるすべてのアイテムを削除するにはどうすればよいですか?

4

3 に答える 3

13

唯一の方法はSystem.Predicate、デリゲートを必要とするものを使用せずに (申し訳ありませんが、powershell で匿名デリゲートを作成する方法がわかりません)、where-object 句を使用することだと思います。

私の例では、$foo再度キャストする必要がある同じ変数に結果を再割り当てしlist<T>ます。

結果カウントが 1 つだけの場合にエラーを回避するには、常にarray値を作成するために「,」が必要です

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

編集:

いくつかのテストの後、powershell スクリプトブロックを使用してラムダ式を使用する方法を見つけました。

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

System.Predicateこれは、 powershellで必要なメソッドを使用する正しい方法です

于 2012-05-08T18:42:05.033 に答える
4

スクリプトブロック (匿名デリゲート) を使用した別のオプションを次に示します。

$foo.RemoveAll( {$args[0].Name -clike 'F*'} )
于 2012-05-09T08:21:13.130 に答える