2011-12-22 21 views
31

Aşağıdaki yapının bir nesne dizisi vardır:Birliği ve Kavşak?

structure Disk 
{ 
    int UID; 
    String Computer; 
} 

bir bilgisayar paylaşılan disklerin bir grup olabilir, ve bir disk bilgisayarlar arasında paylaşılabilir.

Tüm bilgisayarlarda yaygın olan tüm diskleri öğrenmek istiyorum. Örneğin, bilgisayar A, B ve C var; Diskler 1, 2 ve 3. Disk dizisi {1, A}, {1, B}, {2, A}, {2, B}, {2, C}, {3, A} şeklindedir. İstediğim sonuç disk 2 olmalı, çünkü A, B ve C üzerinde görünür.

Bunu başarmanın etkili bir yolu var mı?

Birden çok foreach döngüsüyle ulaşılabilir, ancak kesinlikle daha iyi bir yol istiyorum. Kesişme gibi işlemleri düşünüyorum ama bunu PowerShell'de bulamadım.

+1

Başlığı "PowerShell'de" Union, Intersection and Difference/Set Subtraction "olarak değiştirmenizi öneririz. Böylece tüm operasyonları tek bir yerde yapacağız. –

+0

Burada soru ve önerilerinize dayanarak, Nesneler için Birleşim, Kavşak ve Eksi yapmak için bir PowerShell işlevi oluşturdum. Şuna bir göz atın: https://sqljana.wordpress.com/2015/09/23/perform-set-operations-union-intersection-minus-complement-using-powershell/ –

cevap

56

dizisi $arr varsayarsak, böyle yapabilirsiniz: Genel olarak

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

, böyle PowerShell birlik ve kavşak yaklaşım olacaktır:

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

Ama ne için soruyorsunuz, yukarıdaki çözüm iyi çalışıyor ve gerçekten de, standart terimlerin tanımında sendika ve kavşakla ilgili değil.

Güncelleme: Ben Powershell ile belirlenen birlik ve kavşak ulaşmak için yardımcı Union-List ve Intersect-List sağlar pslinq yazdım

. $a olsa boşsa

+0

Harika şeyler, bu onelinler anahtarlı koleksiyonlarla nasıl çalışır? Hashtables gibi mi? – Bastl

+1

Harika gönderi - böyle işlevler sağlayan diziler için standart bir kütüphane olmalıdır. powershell için lodash .. – ferr

+1

tamlık için $ a kullanarak $ a ve $ b arasındaki set farkını alabilirsiniz. ? {$ b -notcontains $ _} #difference –

11

Ayrıca

$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 

Çalışmaz yapabilirsiniz. set çıkarma için

+1

Diziye $ null eklenebilir. $ a = 1,2,3,4, $ null –

10

(a - b): Bu daha yeni sürümlerinde, en erken sürümlerinde çalışmaz iken

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

+7

Ayrıca -notcontains vardır. –

3

sadece doğrudan .NET LINQ uzantısı işlevleri çağırmak, ör

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

(bazı enumerable tipine döküm olmadan, PowerShell bir "aşırı bulamıyorum" hatası atar.)

Bu kesinlikle PowerShell V4 ve V5 çalışır ve kesinlikle V2 içinde değildir. V3 ile elimde bir sistem yok.

İlgili konular