Âm thanh như bạn muốn tất cả mọi thứ trong array2
trừ gì trong array1
:
var onlyInArray2 = array2.Except(array1);
Tất nhiên, nếu bạn cũng muốn biết điều gì là duy nhất ở array1
bạn có thể sử dụng:
var onlyInArray1 = array1.Except(array2);
(Tất cả điều này yêu cầu .NET 3.5 trở lên hoặc LINQBridge thay thế đối tượng khác chẳng hạn như LINQBridge.)
Tôi giả định rằng thứ tự không quan trọng khi tính toán sự khác biệt - Except
là toán tử dựa trên tập hợp, vì vậy giả định rằng bạn đang liên quan đến bộ sưu tập làm bộ.
Lưu ý rằng Except
chỉ trả về một IEnumerable<T>
- nếu bạn muốn kết quả như mảng, bạn sẽ cần phải gọi ToArray
:
var onlyInArray2 = array2.Except(array1).ToArray();
var onlyInArray1 = array1.Except(array2).ToArray();
Nếu bạn muốn sự khác biệt đối xứng, nghĩa là bạn chỉ quan tâm đến những giá trị là trong một mảng duy nhất, chứ không phải là hoạt động của mảng họ đến từ đâu, bạn có thể sử dụng:
var onlyInOneArray = array1.Union(array2).Except(array1.Intersect(array2));
hoặc bạn có thể sử dụng trực tiếp HashSet
:
var set = new HashSet<string>(array1);
// This modifies the set...
set.SymmetricExceptWith(array2);
Trong tất cả các lệnh này, thứ tự kết quả là không xác định, mặc dù trong thực tế, Except
sẽ giữ nguyên thứ tự gốc của đối số đầu tiên. Trong khi điều này là nghiêm chỉnh nói một chi tiết thực hiện, tôi nghĩ rằng nó rất khó có thể thay đổi.
Giống như các toán tử dựa trên tập hợp khác trong LINQ, Except
sẽ chỉ trả về bất kỳ phần tử nào một lần - vì vậy nếu COM8
xuất hiện hai lần trong array2
, nó sẽ chỉ xuất hiện một lần trong kết quả.
Nó sẽ thực sự giúp đỡ nếu bạn muốn cung cấp thêm thông tin cụ thể về so sánh bạn muốn thực hiện. Ví dụ, bạn có coi trọng thứ tự quan trọng không? Trường hợp? Điều gì xảy ra nếu một phần tử xuất hiện trong 'com1' nhưng không phải là' com2'? –