为什么枚举后比较运算符不起作用?
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
.
我在下面有一个非常简单的用例,我需要在其中查找数组的某个元素是否存在。为什么在这种情况下条件运算符不起作用?
@("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
.