假设我有一对数组:如何获得一个空列表而不是null?
$a = 1,2,3
$b = 4,5,6
和我得到的交集(空):
$c = $a |?{$b -contains $_}
我希望$c
包含空列表,这样我可以这样做:
$c.length
但我没有。我得到一个$null
(当查询.length
时发出异常)。我怎样才能得到一个空的列表呢?
假设我有一对数组:如何获得一个空列表而不是null?
$a = 1,2,3
$b = 4,5,6
和我得到的交集(空):
$c = $a |?{$b -contains $_}
我希望$c
包含空列表,这样我可以这样做:
$c.length
但我没有。我得到一个$null
(当查询.length
时发出异常)。我怎样才能得到一个空的列表呢?
敷在数组构造:
$c = @($a | ? { $b -contains $_ })
我希望$ 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.
除非你在'严格'模式下运行?
$ null.Length返回0与PowerShell 5 –
什么是您的PowerShell版本? – Matt
我测试的代码运行在4.0 – ekkis