Tôi nghĩ điều quan trọng cần nhấn mạnh - sử dụng phương pháp Ngoại trừ sẽ trả về cho bạn các mục chỉ có trong mục đầu tiên mà không có mục trong mục thứ hai. Nó không trả về những phần tử không xuất hiện ở vị trí thứ hai.
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
Nhưng nếu bạn muốn có sự khác biệt thực sự giữa hai danh sách:
Các mục có trong mục đầu tiên mà không có các mục trong mục thứ hai và các mục nằm trong mục thứ hai mà không có mục trong mục đầu tiên.
Bạn cần sử dụng Ngoại trừ hai lần:
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
Hoặc bạn có thể sử dụng phương thức SymmetricExceptWith của HashSet. Nhưng nó thay đổi tập hợp được gọi là:
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
là hoạt động Đặt , sau đó danh sách kết quả sẽ có các giá trị riêng biệt, ví dụ:{'A','A','B','C'}.Except({'B','C'})
trả về{'A'}