我正在尝试在PowerShell中使用LINQ。由于PowerShell是基于.NET Framework构建的,因此这似乎应该完全有可能,但是我无法使其正常工作。例如,当我尝试以下(人为)代码时:
$data = 0..10
[System.Linq.Enumerable]::Where($data, { param($x) $x -gt 5 })
我收到以下错误:
找不到“ Where”和参数计数:“ 2”的重载。
没关系,事实可以用来完成Where-Object
。这个问题的目的不是要找到在PowerShell中执行此操作的惯用方式。如果我可以使用LINQ,则在PowerShell中完成某些任务将容易很多年。
您的代码存在问题,因为PowerShell无法确定ScriptBlock
实例({ ... }
)应该转换为哪种特定的委托类型。因此,无法为该Where
方法的通用第二个参数选择类型具体的委托实例化。而且它也没有语法来明确指定通用参数。要解决此问题,您需要自己将ScriptBlock
实例强制转换为正确的委托类型:
$data = 0..10
[System.Linq.Enumerable]::Where($data, [Func[object,bool]]{ param($x) $x -gt 5 })
为什么
[Func[object, bool]]
有效,但[Func[int, bool]]
无效?
因为您$data
是[object[]]
,而不是[int[]]
,因为PowerShell [object[]]
默认情况下会创建数组。但是,您可以[int[]]
显式构造实例:
$intdata = [int[]]$data
[System.Linq.Enumerable]::Where($intdata, [Func[int,bool]]{ param($x) $x -gt 5 })
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句