假设我有几个数组:
$a = 1,2,3
$b = 4,5,6
我得到了交叉点(空):
$c = $a |?{$b -contains $_}
我希望$c
包含一个空列表,以便我可以这样做:
$c.length
但我不知道。我得到一个$null
(在查询.length
时会发出异常)。我怎样才能取回一个空列表呢?
答案 0 :(得分:5)
将其包装在数组构造函数中:
NULL
答案 1 :(得分:1)
其他解决方案
$c = ($a |?{$b -contains $_}) ,@()
答案 2 :(得分:1)
我希望$ c包含一个空列表
你不应该期望,它不是一个Python风格的列表理解,它总是建立一个列表 - 即使列表是空的。
它是通过管道放置对象,通过过滤器测试,并存储管道输出。如果没有任何东西通过过滤器,则无法存储输出。管道不会从一处冒出一个空阵列 - 这会产生误导和烦扰。这是关于数组构造函数的答案来源 - 用@( ... )
包装正在构建一个以管道输出为内容的数组,没有输出意味着一个空数组。
您使用.Length
代替.Count
冒险。例如如果你用字符串做了那么,那么没有任何东西的交集就不会返回长度,两个项目的交集将返回2,但是一个项目的交集将返回字符串的长度:
$a = 'abc','cde','def'
$b = 'ghi','jkl','def'
$c = $a |?{$b -contains $_} #c = 'def'
$c.length # 1 item, length 3
如果你正在使用没有长度属性的数字,这不是问题,但我认为习惯性地使用.Count
来获取项目数量是个更好的主意在一个集合中。
另请参阅此答案:https://stackoverflow.com/a/26513523/478656,了解有关长度与计数属性的相关讨论,以及如何在PSv3 +中更改它们,以便更轻松地处理空白事物。
这让我想到了你的主张:
我收到
$null
(在查询.length
时会发出异常)
它......不是吗?
($null).Length # $null in PSv2, 0 in PSv4, PSv5.1. No exception.
除非你在'严格'中运行。模式?