Je pense qu'il est important de souligner - l'utilisation de la méthode Except vous retournera les éléments qui se trouvent dans le premier sans les éléments du second uniquement. Il ne renvoie pas les éléments en second qui n'apparaissent pas en premier.
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
Mais si vous voulez obtenir une réelle différence entre deux listes:
Les éléments qui sont dans le premier sans les éléments dans le second et les éléments qui sont dans le second sans les éléments dans le premier.
Vous devez utiliser sauf deux fois:
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
Ou vous pouvez utiliser la méthode SymmetricExceptWith de HashSet. Mais cela change l'ensemble sur lequel appelé:
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
Excepts'agit d'une opération Set , puis la liste résultante aura des valeurs distinctes, par exemple des{'A','A','B','C'}.Except({'B','C'})retours{'A'}