The opposite of Intersect()
Solution 1:
As stated, if you want to get 4 as the result, you can do like this:
var nonintersect = array2.Except(array1);
If you want the real non-intersection (also both 1 and 4), then this should do the trick:
var nonintersect = array1.Except(array2).Union( array2.Except(array1));
This will not be the most performant solution, but for small lists it should work just fine.
Solution 2:
You can use
a.Except(b).Union(b.Except(a));
Or you can use
var difference = new HashSet(a);
difference.SymmetricExceptWith(b);
Solution 3:
This code enumerates each sequence only once and uses Select(x => x)
to hide the result to get a clean Linq-style extension method. Since it uses HashSet<T>
its runtime is O(n + m)
if the hashes are well distributed. Duplicate elements in either list are omitted.
public static IEnumerable<T> SymmetricExcept<T>(this IEnumerable<T> seq1,
IEnumerable<T> seq2)
{
HashSet<T> hashSet = new HashSet<T>(seq1);
hashSet.SymmetricExceptWith(seq2);
return hashSet.Select(x => x);
}