为什么枚举后比较运算符不起作用?

Why does the comparison operator not work after enumeration?

我在下面有一个非常简单的用例,我需要在其中查找数组的某个元素是否存在。为什么在这种情况下条件运算符不起作用?

@("a", "b").Where{$_ -eq "a"} -eq $true

.Where() 数组方法充当 过滤器(就像它的 cmdlet 对应物 Where-Object) ,所以它 return 是一个 子数组 [1] 的匹配元素 ,而不是布尔值 .

对于简单相等性测试[2],您可以使用布尔值-contains operator代替:

('a', 'b') -contains 'a' # -> $true

如果你确实需要更复杂的,scriptblock-based test via .Where():

('a', 'b').Where({ $_ -in 'a', 'z' }, 'First').Count -ne 0

请注意 'First' 参数,作为一项重要的优化,它会在找到第一个匹配项后生成 .Where() return。

由于结果总是包裹在数组中[1],检查 .Count 属性 足以确定是否找到匹配项。


[1] 从技术上讲,[System.Collections.ObjectModel.Collection[psobject]] 类型的集合是 returned.

[2] 请注意,PowerShell 默认情况下 不区分大小写 ,但它为 case-sensitive操作;例如,-ccontains,或等效的 operands-reversed -in operator-cin.