2016-11-24 58 views
3

假设我有一对数组:如何获得一个空列表而不是null?

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

和我得到的交集(空):

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

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

$c.length 

但我没有。我得到一个$null(当查询.length时发出异常)。我怎样才能得到一个空的列表呢?

+0

$ null.Length返回0与PowerShell 5 –

+0

什么是您的PowerShell版本? – Matt

+0

我测试的代码运行在4.0 – ekkis

回答

5

敷在数组构造:

$c = @($a | ? { $b -contains $_ }) 
1

其他的解决办法

$c = ($a |?{$b -contains $_}) ,@() 
+0

AFAICS上,'$ c.length'总是会在这里返回'2'。 – PetSerAl

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. 

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

+1

关于例外......你是对的。看起来.length是特殊的。在对.GetType()的调用中生成异常,该调用失败,并显示“您无法对空值表达式调用方法” – ekkis

+1

我选择了Esperento57的答案,因为它实际上回答了这个问题,但是我的答案是+1经过深思熟虑,我确实认同.Count是一种更好的方法,我将转向 – ekkis