2011-12-22 139 views
31

我有以下結構的對象的數組:PowerShell中的聯合和交集?

structure Disk 
{ 
    int UID; 
    String Computer; 
} 

計算機可以有一堆共享磁盤,和一個盤可以計算機之間共享。

我想找出所有計算機通用的所有磁盤。例如,我有電腦A,B和C;磁盤陣列爲{1,A},{1,B},{2,A},{2,B},{2,C},{3,A}。 我想要的結果應該是磁盤2,因爲它出現在A,B和C.

有沒有一種有效的方法來實現這一目標?

有了多個foreach循環,它是可以實現的,但是我確實想要一個更好的方法。我在考慮像交集這樣的操作,但在PowerShell中沒有找到它。

+1

我建議將標題更改爲「在PowerShell中聯合,交叉和差異/設置減法」。所以我們將在一個地方進行所有的操作。 – 2016-04-25 09:15:16

+0

基於這裏的問題和建議,我創建了一個PowerShell函數來爲對象執行聯合,交集和減法。檢查出來:https://sqljana.wordpress.com/2015/09/23/perform-set-operations-union-intersection-minus-complement-using-powershell/ – 2016-12-02 16:35:30

回答

56

假設$arr的數組,你可以這樣做:

$computers = $arr | select -expand computer -unique 
$arr | group uid | ?{$_.count -eq $computers.count} | select name 

在一般情況下,我會接近並和交PowerShell中這樣的:

$a = (1,2,3,4) 
$b = (1,3,4,5) 
$a + $b | select -uniq #union 
$a | ?{$b -contains $_} #intersection 

但對於什麼你問,上面的解決方案工作得很好,而不是關於術語標準定義中的聯合和交集。

更新:

我已經寫pslinq提供Union-ListIntersect-List,幫助實現建立工會和路口使用PowerShell。

+0

酷的東西,這些oneliners如何與密鑰集合像哈希表? – Bastl 2015-11-18 12:06:52

+1

好帖子 - 應該有一個標準的數組庫,提供這樣的功能。 lodash for powershell .. – ferr 2016-03-02 20:25:51

+1

爲了完整性,您可以使用 $ a |獲得$ a和$ b之間的設置差異。 {{$ b -notcontains $ _} #difference – 2016-06-27 22:22:02

11

你也可以做

$a = (1,2,3,4) 
$b = (1,3,4,5) 
Compare-Object $a $b -PassThru -IncludeEqual     # union 
Compare-Object $a $b -PassThru -IncludeEqual -ExcludeDifferent # intersection 

不工作,如果$a爲空,但。

+1

可以向數組添加$ null。 $ a = 1,2,3,4,$ null – 2014-01-10 17:11:59

10

對於集相減( - B):

$a | ?{-not ($b -contains $_)}

+7

還有-notcontains。 – 2014-01-10 17:08:59

3

雖然這不會在最早版本的工作,在新的版本你可以直接調用.NET的LINQ擴展功能,例如

[system.linq.enumerable]::union([object[]](1,2,3),[object[]](2,3,4)) 

(無投一些枚舉類型,PowerShell中拋出一個「無法找到過載」錯誤。)

這絕對作品在PowerShell中V4和V5,絕對在V2沒有。 V3沒有系統。