2013-04-17 3 views
1

Я стараюсь забрать один набор из другого самым эффективным способом. Поэтому, если у меня есть следующие множества A и B, тогда A_minus_B должен дать {1, 2, 6}. Вот что я имею, хотя я уверен, что это не самый эффективный способ.Set A минус 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

Посмотрите на метод расширения Except в LINQ. Вы можете выбрать все элементы из одного списка, где они не существуют в другом списке. –

+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, он будет изменять A путем удаления элементов, которые находятся в B:

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 ваш новый отфильтрованный набор.