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>.

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

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

编辑:

经过一些测试,我发现如何使用 lambda 表达式使用 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 回答
0

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

于 2017-10-03T20:42:23.400 回答