Я думаю, що важливо підкреслити - використання методу «Крім » поверне вам речі, які перебувають у першому, без предметів лише у другому. Він не повертає тих елементів у секунду, які не з’являються спочатку.
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
Але якщо ви хочете отримати реальну різницю між двома списками:
Предмети, які перебувають у першому, без предметів у другому та предмети, які знаходяться у другому, без предметів у першому.
Вам потрібно використовувати крім двох разів:
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
Або ви можете використовувати метод SymmetricExceptWith методу HashSet. Але це змінює набір, за яким викликається:
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це операція Set , тоді в отриманому списку будуть виразні значення, наприклад{'A','A','B','C'}.Except({'B','C'})повернення{'A'}