我正在尝试在 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 method。而且它也没有显式指定通用参数的语法。要解决此问题,您需要强制转换ScriptBlock
自己实例化正确的委托类型:
$data = 0..10
[System.Linq.Enumerable]::Where($data, [Func[object,bool]]{ param($x) $x -gt 5 })
为什么[Func[object, bool]]
工作,但是[Func[int, bool]]
才不是?
因为你的$data
is [object[]]
, not [int[]]
,假设 PowerShell 创建了[object[]]
默认为数组;但是,你可以构造[int[]]
明确实例:
$intdata = [int[]]$data
[System.Linq.Enumerable]::Where($intdata, [Func[int,bool]]{ param($x) $x -gt 5 })
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)