2013-04-17 57 views
1

我試圖以最有效的方式從另一套拿走一套。所以如果我有以下集合A和B,那麼A_minus_B應該給出{1,2,6}。儘管我確信這不是最有效的方法,但我仍有這樣的想法。Set A minus Set B

HashSet<int> A = new HashSet<int>{ 1, 2, 3, 4, 5, 6 }; 
HashSet<int> B = new HashSet<int> { 3, 4, 5 }; 

HashSet<int> A_minus_B = new HashSet<int>(A); 

foreach(int n in A){ 
    if(B.Contains(n)) A_minus_B.Remove(n); 
} 
+0

看看LINQ中的'Except'擴展方法。您可以從一個列表中選擇其他列表中不存在的所有項目。 –

+1

你看過[ExceptWith](http://msdn.microsoft.com/en-us/library/bb299875.aspx) – tnw

回答

5

您可以使用Except()方法。下面是代碼:

HashSet<int> A_minus_B = new HashSet<int>(A.Except(B)); 
1

您可以使用ExceptWith,它會通過移除在B項修改A

A.ExceptWith(B); 

您還可以使用Except將返回新集;

+0

請注意,這是修改集合「A」,而不是返回一個代表集合的新集合區別。 – Servy

+0

謝謝,我修改了我的答案以揭露它。 – Zbigniew

2

使用此:

var setA= new HashSet<int>(); 
var setB= new HashSet<int>(); 
... 

var remaining = new HashSet<int>(setA); 
remaining.ExceptWith(setB); 

remaining是新的過濾集。

相關問題