2016-11-24 55 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