2011-12-22 13 views
31

मैं निम्नलिखित संरचना की वस्तुओं की एक सरणी है:पावरशेल में संघ और छेड़छाड़?

structure Disk 
{ 
    int UID; 
    String Computer; 
} 

एक कंप्यूटर साझा डिस्क का एक समूह हो सकता है, और एक डिस्क कंप्यूटर के बीच साझा किया जा सकता है।

मैं सभी कंप्यूटरों के लिए सभी डिस्क को सामान्य रूप से ढूंढना चाहता हूं। उदाहरण के लिए, मेरे पास कंप्यूटर ए, बी, और सी है; डिस्क 1, 2, और 3. डिस्क सरणी {1, ए}, {1, बी}, {2, ए}, {2, बी}, {2, सी}, {3, ए} है। परिणाम जो मैं चाहता हूं डिस्क 2 होना चाहिए, क्योंकि यह ए, बी, और सी

पर प्राप्त करने का कोई प्रभावी तरीका है?

एकाधिक फ़ोरैच लूप के साथ यह प्राप्त करने योग्य है, लेकिन निश्चित रूप से मैं एक बेहतर तरीका चाहता हूं। मैं चौराहे जैसे संचालन के बारे में सोच रहा हूं, लेकिन इसे PowerShell में नहीं मिला।

+1

मैं शीर्षक को "संघ, छेड़छाड़ और अंतर/पावरशेल में सेट घटाव" में बदलने की अनुशंसा करता हूं। तो हमारे पास एक ही स्थान पर सभी सेट ऑपरेशन होंगे। –

+0

यहां प्रश्न और सुझावों के आधार पर, मैंने वस्तुओं के लिए संघ, छेड़छाड़ और माइनस करने के लिए पावरशेल फ़ंक्शन बनाया है। इसे देखें: https://sqljana.wordpress.com/2015/09/23/perform-set-operations-union-intersection-minus-complement-using-powershell/ –

उत्तर

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-List और Intersect-List कि Powershell के साथ संघ और चौराहे सेट प्राप्त करने के लिए मदद प्रदान करता है लिखा है।

+0

कूल सामान, ये ऑनलाइनर कुंजी संग्रहों के साथ कैसे काम करेंगे हैशटेबल्स की तरह? – Bastl

+1

ग्रेट पोस्ट - ऐसे सरणी के लिए एक मानक लाइब्रेरी होनी चाहिए जो इस तरह की कार्यक्षमता प्रदान करे। शक्तियों के लिए lodash .. – ferr

+1

पूर्णता के लिए आप $ ए का उपयोग कर $ ए और $ बी के बीच सेट अंतर प्राप्त कर सकते हैं। {$ b -notcontains $ _} # डिफरेंस –

11

तुम भी यदि $a हालांकि अशक्त है

$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 

काम नहीं करता जा सकता है।

+1

सरणी में $ null जोड़ सकता है। $ ए = 1,2,3,4, $ शून्य –

10

सेट घटाव के लिए (एक - ख):

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

+7

भी -नॉटकेंटेन्स हैं। –

3

इस जल्द से जल्द संस्करणों में काम नहीं करते हैं, अधिक हाल के संस्करणों में तुम सिर्फ नेट LINQ विस्तार कार्यों सीधे कॉल कर सकते हैं, उदाहरण के लिए

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

(कुछ गणनीय प्रकार के कलाकारों के बिना, PowerShell एक "अधिभार नहीं मिल सकता है" त्रुटि फेंकता है।)

यह निश्चित रूप से PowerShell V4 और V5 में काम करता है और निश्चित रूप से V2 में नहीं है। मेरे पास वी 3 के साथ एक प्रणाली नहीं है।