как выбрать элементы, которые не пересекаются?

Если у меня есть два списка, и я хочу, чтобы элементы были общими в обоих списках, я могу использовать этот код:

var listC = listA.Intersect(listB);

Однако, если я хочу элементы, которые не являются общими? И без дубликатов? можно с пересечением?

Спасибо.


person Álvaro García    schedule 09.06.2013    source источник


Ответы (3)


Да, это возможно. Он называется Enumerable.Except.

Использовать это:

var result = listA.Except(listB); //maybe a .ToList() at the end,
//or passing an IEqualityComparer<T> if you want a different equality comparison.
person It'sNotALie.    schedule 09.06.2013

Пока ни один из ответов не будет включать элементы из listB, которых нет в listA. Чтобы получить любой элемент, который есть в любом списке, но не в обоих списках:

listA.Union(listB).Except(listA.Intersect(listB));
person Kent Boogaart    schedule 09.06.2013
comment
Кроме того, вы также можете сделать listA.Except(listB).Union(listB.Except(listA)) - person Robert McKee; 09.06.2013
comment
+1, это лучший ответ, чем мой. - person It'sNotALie.; 10.06.2013

Наиболее эффективным:

var set = new HashSet<T>(listA);
set.SymmetricExceptWith(listB);
person lisp    schedule 09.06.2013