Penso sia importante sottolineare: l'utilizzo del metodo Except restituirà gli elementi che si trovano nel primo senza gli elementi solo nel secondo. Non restituisce quegli elementi in secondo che non appaiono in primo.
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
Ma se vuoi ottenere una reale differenza tra due elenchi:
Elementi che si trovano nel primo senza gli elementi nel secondo e gli elementi che si trovano nel secondo senza gli elementi nel primo.
È necessario utilizzare tranne due volte:
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
Oppure puoi usare il metodo SymmetricExceptWith di HashSet. Ma cambia il set su cui ha chiamato:
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
Exceptè un'operazione di impostazione , quindi l'elenco risultante avrà valori distinti, ad esempio{'A','A','B','C'}.Except({'B','C'})ritorni{'A'}