Creo que es importante enfatizar: el uso del método Except le devolverá los artículos que están en el primero sin los artículos del segundo solamente. No devuelve aquellos elementos en segundo que no aparecen en primero.
var list1 = new List<int> { 1, 2, 3, 4, 5};
var list2 = new List<int> { 3, 4, 5, 6, 7 };
var list3 = list1.Except(list2).ToList(); //list3 contains only 1, 2
Pero si desea obtener una diferencia real entre dos listas:
Elementos que están en el primero sin los elementos del segundo y elementos que están en el segundo sin los elementos del primero.
Necesita usar Excepto dos veces:
var list1 = new List<int> { 1, 2, 3, 4, 5};
var list2 = new List<int> { 3, 4, 5, 6, 7 };
var list3 = list1.Except(list2); //list3 contains only 1, 2
var list4 = list2.Except(list1); //list4 contains only 6, 7
var resultList = list3.Concat(list4).ToList(); //resultList contains 1, 2, 6, 7
O puede utilizar SymmetricExceptWith método de HashSet. Pero cambia el conjunto en el que llamó:
var list1 = new List<int> { 1, 2, 3, 4, 5};
var list2 = new List<int> { 3, 4, 5, 6, 7 };
var list1Set = list1.ToHashSet(); //.net framework 4.7.2 and .net core 2.0 and above otherwise new HashSet(list1)
list1Set.SymmetricExceptWith(list2);
var resultList = list1Set.ToList(); //resultList contains 1, 2, 6, 7
Exceptes una operación Set , luego la lista resultante tendrá valores distintos, por ejemplo,{'A','A','B','C'}.Except({'B','C'})devuelve{'A'}