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

使用通用列表时如何删除所有<;T>;在powershell中,powershell,powershell-2.0,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";

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

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

如何应用
List
的RemoveAll()方法?可以使用谓词吗?例如,我如何删除以大写字母“F”开头的所有项?

我认为唯一的方法是不使用需要委托的
系统。谓词
(抱歉,但我确实不知道如何在powershell中创建匿名委托)并使用where object子句

在我的示例中,我将结果重新分配给相同的
$foo
变量,该变量需要再次转换为
列表

如果结果计数只有一个,为了避免错误,需要使用“,”来始终创建一个
数组

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

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

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

这是在powershell中使用需要
System.Predicate
的方法的正确方法这里有另一个使用脚本块(匿名委托)的选项:


事实证明,我真正想要的是.clear()方法,而不是RemoveAll。仅当要删除一组项而不是列表中的所有项时,才需要RemoveAll

见鬼,看起来很丑。如果成功了,谁在乎呢?非常感谢。我打赌人们可以在Powershell中调用DLR并构造一个可以作为lambda传递的匿名方法。不过,我自己肯定不会写这篇文章:)@Shibumi我发现了如何在不调用DLR的情况下传递lambda。阅读我的编辑。
$foo.RemoveAll( {$args[0].Name -clike 'F*'} )