2012-06-12 28 views
21

Làm thế nào để so sánh hai chuỗi mảng bằng cách sử dụng C# .net? Ví dụ:Làm thế nào để có được sự khác biệt giữa hai mảng chuỗi trong C#?

string[] com1 = { "COM6", "COM7" }; 
string[] com2 = { "COM6", "COM7","COM8" }; 

Đây COM1 và COM2 là mảng chuỗi. Kết quả: COM8. Làm thế nào để đạt được điều này?

+9

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'? –

Trả lời

6

Tôi nghĩ rằng đây là con đường ngắn nhất để giải quyết này

foreach (string com in com2) 
{ 
    if (!com1.Contains(com)) 
    { 
     MessageBox.Show(com); 
    } 
} 
17

Sử dụng LINQ Except extension:

IEnumerable<string> result = com2.Except(com1); 
// result: { "COM8" } 
+0

Gợi ý: thay đổi 'kết quả' thành' trừ' (hoặc cách khác) – Default

49

Âm thanh như bạn muốn tất cả mọi thứ trong array2trừ 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ả.

+1

Nữ hoàng Jon, bổ sung thêm điều gì đó ;-) – aleroot

+2

Tôi nghĩ rằng với câu trả lời tốt hơn ở đây bạn có thể viết một cuốn sách khác ... Tôi sẽ mua nó chắc chắn! – aleroot

2

Nếu bạn muốn tất cả mọi thứ đó là trong một danh sách nhưng không phải cả hai, trong một biểu thức duy nhất, bạn có thể sử dụng Union, IntersectExcept:

var inOnlyOneArray = array1.Union(array2).Except(array1.Intersect(array2)); 
+0

+, đó là một thông minh! –

1

Như những người khác đã nói, các phương pháp khuyến nông Except là chắc chắn là con đường để đến đây.Tuy nhiên, tôi sẽ bổ sung rằng có vẻ như bạn có thể muốn kiểm soát cách so sánh được thực hiện; nếu 'COM8' đề cập đến một định danh cổng nối tiếp, sau đó bạn muốn thực hiện một case-insensitive so sánh:

var result = com2.Except(com1, StringComparer.OrdinalIgnoreCase); 
Các vấn đề liên quan