如何在powershell中使用通用列表<T>时删除所有

iLe*_*ing 6 powershell powershell-2.0

如果我使用这样的通用列表:

$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"; }))
Run Code Online (Sandbox Code Playgroud)

我该如何应用RemoveAll()方法List<T>?是否可以使用谓词?我怎样才能删除以大写字母'F'开头的所有项目?

CB.*_*CB. 11

我认为唯一的方法是不使用System.Predicate需要委托(抱歉,但实际上我无法弄清楚如何在powershell中创建匿名委托)并使用where-object子句.

在我的示例中,我将结果重新分配给$foo需要再次强制转换的同一变量list<T>.

为了避免错误,如果结果计数只有一个,则需要','来创建一个array

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

编辑:

经过一些测试,我发现如何使用powershell scriptblock使用lambda表达式:

$foo.removeAll( { param($m)  $m.name.startswith( 'F', $false , $null)  })
Run Code Online (Sandbox Code Playgroud)

这是使用System.Predicatepowershell 中需要的方法的正确方法


Sha*_*evy 6

这是使用脚本块(匿名委托)的另一个选项:

$foo.RemoveAll( {$args[0].Name -clike 'F*'} )
Run Code Online (Sandbox Code Playgroud)