2010-07-27 42 views
22

Làm thế nào tôi có thể so sánh hai chuỗi trong C# và nhận được sự khác biệt?So sánh hai chuỗi và nhận được sự khác biệt

ví dụ:

Chuỗi1: tôi có một chiếc xe

chuỗi2: tôi có một chiếc xe mới bmw

kết quả: mới, bmw

+1

Chúng ta có thể giả sử bạn muốn nó chia bởi Ranh giới từ? – ChaosPandion

+2

Còn khoảng cách giữa "mới" và "ô tô" và giữa "xe hơi" và "bmw" thì sao? Bạn có cần phải biết rằng một trong những từ đã xảy ra trước khi "xe hơi" và một từ khác sau? Điều gì về sự khác biệt giữa "tôi có một chiếc xe mới" và "tôi có một chiếc xe mới"? "mới" có khác biệt ở đây không? Điều gì về xóa? "Tôi có một chiếc xe mới" so với "tôi có một chiếc xe hơi"? Bạn có muốn biết rằng "mới" + không gian đã bị xóa không? Tóm lại, bạn cần cho chúng tôi biết một số giả định hoặc giới hạn của bạn đối với vấn đề của bạn. –

+0

@Lasse V. Karlsenno, trong trường hợp đó sự khác biệt là "đó", "là" @ChaosPandion, tôi nghĩ có: p. Tôi không biết làm thế nào tôi có thể làm điều này: S – Luis

Trả lời

23

Bạn cần phải chắc chắn rằng các thiết lập lớn hơn là ở phía bên tay trái của Except (không chắc chắn nếu có một LINQ cách tinh khiết để đạt được điều đó):

static void Main(string[] args) 
    { 
     string s1 = "i have a car a car"; 
     string s2 = "i have a new car bmw"; 

     List<string> diff; 
     IEnumerable<string> set1 = s1.Split(' ').Distinct(); 
     IEnumerable<string> set2 = s2.Split(' ').Distinct(); 

     if (set2.Count() > set1.Count()) 
     { 
      diff = set2.Except(set1).ToList(); 
     } 
     else 
     { 
      diff = set1.Except(set2).ToList(); 
     } 
    } 
+0

công việc này không, nói rằng riêng biệt phải có đối số. Và ngoại trừ nói: Lỗi 'System.Collections.Generic.IEnumerable ' không chứa định nghĩa cho 'Ngoại trừ' và không có phương pháp mở rộng 'Ngoại trừ' chấp nhận đối số đầu tiên của loại 'System.Collections.Generic.IEnumerable 'có thể được tìm thấy (bạn đang thiếu một chỉ thị bằng cách sử dụng hoặc một tham chiếu lắp ráp?) – Luis

+0

làm việc cho tôi trong .NET 3.5 Bạn đang sử dụng .NET 2.0? –

+0

có thể là một số tham chiếu. bạn có tài liệu tham khảo gì? – Luis

5

Bạn có thể sử dụng một thuật toán khác biệt cho điều này bài tập. Bài báo "An O(ND) Difference Algorithm and Its Variations" mô tả một thuật toán khá mạnh để hoàn thành nhiệm vụ này. Để thực hiện trong C#, bạn có thể xem "An O(ND) Difference Algorithm for C#", nhưng IMHO nó chắc chắn thú vị hơn khi có một cái nhìn vào giấy và thực hiện nó cho chính mình trong trường hợp bạn quan tâm đến cách thuật toán hoạt động chi tiết.

8

Đặt câu hỏi của bạn (Có chút mơ hồ) tính năng này sẽ hoạt động.

var first = string1.Split(' '); 
var second = string2.Split(' '); 
var primary = first.Length > second.Length ? first : second; 
var secondary = primary == second ? first : second; 
var difference = primary.Except(secondary).ToArray(); 

Ở phía trên cùng của tập tin của bạn chắc chắn rằng bạn bao gồm:

using System.Linq; 
+0

điều này sẽ làm cho hai dây giống hệt nhau: "tôi có một chiếc xe" và "chiếc xe tôi có". Nhưng có, không chắc chắn rằng đó là OK với OP. –

+0

hoạt động với lặp lại? ví dụ "tôi có một chiếc xe tôi có" so với "tôi có một chiếc xe" – Luis

+0

không trả lại kết quả nếu đặt nhỏ hơn ở bên trái –

Các vấn đề liên quan