gpt4 book ai didi

powershell - 找不到 "ToLookup"和参数计数 : "2" LINQ 的重载

转载 作者:行者123 更新时间:2023-12-05 01:50:36 24 4
gpt4 key购买 nike

我有一个每小时运行一次的 PowerShell 脚本,它基本上通过滴灌过程更新产品信息。该脚本在开发环境中失败,但在生产和质量中继续工作。故障点在使用 LINQ 的线路上。这是脚本:

$productInfos = [pscustomobject]@{
product_name = 'Television'
price = 1000
product_id = 101
} | ForEach-Object{$_}

$productIdDelegate = [Func[object,int]] {$args[0].product_id}
$productInfos = [Linq.Enumerable]::ToLookup($productInfos, $productIdDelegate)

从技术上讲,它在最后一行失败了。但是包括倒数第二行是因为在研究这个问题时,我发现很多其他帖子指出如果 ToLookup linq 函数中的两个参数不是同一类型,它可能会导致这个问题。倒数第二行是许多用户的“假定”修复,但遗憾的是不是我自己。我仍然收到

Cannot find an overload for "ToLookup" and the argument count: "2"

我检查了所有 3 个环境的依赖关系,一切都是一样的。而且,powershell 版本也都相同。

最佳答案

即使错误没有提供太多细节,从您当前可重现的代码我们可以看出问题是因为 $productInfos 是类型为 PSObject 的单个对象并且此类未实现 IEnumerable Interface :

$productInfos = [pscustomobject]@{
product_name = 'Television'
price = 1000
product_id = 101
}

$productInfos -is [System.Collections.IEnumerable] # => False

要确保 $productInfos 始终是一个可编号,您可以使用 Array subexpression operator @( ) :

@($productInfos) -is [System.Collections.IEnumerable] # => True

转换 [object[]][array] 也应该是一个选项:

[object[]] $productInfos -is [System.Collections.IEnumerable] # => True
[array] $productInfos -is [System.Collections.IEnumerable] # => True

但是上述方法仅在 $productInfos 至少有 1 个元素 时有效,而不是 @(..)始终确保数组:

The result is always an array of 0 or more objects.

总结:

$productInfos = [Linq.Enumerable]::ToLookup([object[]] $productInfos, $productIdDelegate)
$productInfos = [Linq.Enumerable]::ToLookup(@($productInfos), $productIdDelegate)
$productInfos = [Linq.Enumerable]::ToLookup([array] $productInfos, $productIdDelegate)

是否所有有效选项都考虑了上面的解释,如果我们不确定变量是否将始终被填充,最安全的选择将始终是 @(...):

# Returns Null instead of an error:

[Linq.Enumerable]::ToLookup(@(), $productIdDelegate)

关于powershell - 找不到 "ToLookup"和参数计数 : "2" LINQ 的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72930890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com