Uma das coisas mais legais de estudar programação funcional é que com o tempo o mindset vai mudando e algumas soluções interessantes aparecem. Como nosso amado LINQ foi desenvolvido com o mindset funcional, ele trata com excelência listas (Lists Comprehension). Alguns exemplos de intersecção de listas.

Dado listA e ListB

var listA = new int[] { 1, 2, 3, 4, 5 };var listB = new int[] { 4, 5, 6, 7, 8 };

Selecionar elementos de ListA comuns a ListB

var intersectAB = listA.Intersect(listB);

Selecionar elementos de ListB comuns a ListA

var intersectBA = listB.Intersect(listA);

Selecionar elementos de ListA que não são comuns a ListB

var exceptAB = listA.Except(listB);

Selecionar elementos de ListB que não são comuns a ListA

var exceptBA = listB.Except(listA);

Selecionar elementos de ambas as listas que não possuam intersecção

var symetric = listA
    .Except(listB)
    .Union(second: listB.Except(listA));

Quando a lista for grande ou complexa, é possível fazer a operação de exceção simétrica utilizando um hashset, que irá modificar a hashset collection, selecionando os elementos de ambas as listas que não possuam intersecção.

var hashSet = new HashSet<int>(listA);
hashSet.SymmetricExceptWith(listB);

LinqExercises at GitHub