如何获取空列表而不是null?

时间:2016-11-24 16:56:08

标签: powershell

假设我有几个数组:

$a = 1,2,3
$b = 4,5,6

我得到了交叉点(空):

$c = $a |?{$b -contains $_}

我希望$c包含一个空列表,以便我可以这样做:

$c.length

但我不知道。我得到一个$null(在查询.length时会发出异常)。我怎样才能取回一个空列表呢?

3 个答案:

答案 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.

除非你在'严格'中运行。模式?