2012-10-16 47 views
5

Tôi đang cố gắng để có một tính năng gợi ý cho chức năng tìm kiếm trong chương trình của tôi, ví dụ tôi gõ janw doe trong phần tìm kiếm và nó sẽ xuất ra NO MATCH - ý bạn là jane doe? Tôi không chắc chắn vấn đề là gì, có lẽ một cái gì đó để làm với char/string so sánh .. Tôi đã cố gắng so sánh cả hai biến như loại char ví dụ như char temp -> temp.Contains ... vv nhưng một lỗi xuất hiện (char không chứa định nghĩa cho Chứa). Rất thích sự giúp đỡ về điều này! 8)So sánh Char/String

if (found == false) 
     { 
      Console.WriteLine("\n\nMATCH NOT FOUND"); 
      int charMatch = 0, charCount = 0; 
      string[] checkArray = new string[26]; 
      //construction site ///////////////////////////////////////////////////////////////////////////////////////////////////////////// 
      for (int controlLoop = 0; controlLoop < contPeople.Length; controlLoop++) 
      { 
       foreach (char i in userContChange) 
       { 
        charCount = charCount + 1; 
       } 
       for (int i = 0; i < userContChange.Length;) 
       { 
        string temp = contPeople[controlLoop].name; 
        string check=Convert.ToString(userContChange[i]); 
        if (temp.Contains(check)) 
        { 
         charMatch = charMatch + 1; 
        } 
       } 
       int half = charCount/2; 
       if (charMatch >= half) 
       { 
        checkArray[controlLoop] = contPeople[controlLoop].name; 
       } 
      } 
/////////////////////////////////////////////////////////////////////////////////////////////////////////// 
       Console.WriteLine("Did you mean: "); 
       for (int a = 0; a < checkArray.Length; a++) 
       { 
        Console.WriteLine(checkArray[a]); 
       } 
/////////////////////////////////////////////////////////////////////////////////////////////////// 
+0

Câu hỏi của bạn không phải là rất rõ ràng, bạn đang gặp rắc rối với mã nào? – Alan

Trả lời

6

Chuỗi được tạo thành từ nhiều ký tự. Một nhân vật là một nguyên thủy, tương tự như vậy, nó không "chứa" bất kỳ mục nào khác. Một chuỗi về cơ bản là một mảng các ký tự.

Đối với so sánh chuỗi và ký tự:

char a = 'A'; 
String alan = "Alan"; 
Debug.Assert(alan[0] == a); 

Hoặc nếu bạn có một chuỗi chữ số đơn .. Tôi cho rằng

char a = 'A'; 
String alan = "A"; 
Debug.Assert(alan == a.ToString()); 

Tất cả những khẳng định là đúng

Tuy nhiên, chính lý do tôi muốn bình luận về câu hỏi của bạn, là đề xuất một cách tiếp cận khác để đề xuất "Ý của bạn là gì?". Có một thuật toán gọi là Levenshtein Distance tính toán "số lượng các sửa đổi ký tự đơn" cần thiết để chuyển đổi một chuỗi thành chuỗi khác. Nó có thể được sử dụng như một thước đo về hai chuỗi gần như thế nào. Bạn có thể muốn xem xét thuật toán này hoạt động như thế nào vì nó có thể giúp bạn.

Dưới đây là một applet mà tôi tìm thấy trong đó chứng tỏ: Approximate String Matching with k-differences

Cũng vào liên kết wikipedia Levenshtein distance

+0

Tôi sẽ xem xét thuật toán, S trông phức tạp O_o. Tôi sẽ cho bạn biết làm thế nào nó đi. :) – Quigg15405

+0

thuật toán thực sự là khá đơn giản, có thể thấy nếu bạn có thể tìm thấy một applet tốt hơn cho bạn thấy từng bước – Alan

0

Char loại không thể có .Contains() vì chỉ là 1 char kiểu giá trị.

Trong trường hợp của bạn (nếu tôi hiểu), có thể bạn cần sử dụng .Equals() hoặc toán tử ==.

Lưu ý: để so sánh chuỗi chính xác, sử dụng .Equals(), toán tử == không hoạt động tốt trong trường hợp này vì String là loại tham chiếu.

Hy vọng trợ giúp này!

+0

Bạn có thể so sánh hai ký tự với toán tử ==. Điều quan trọng là một String không thể bằng một ký tự. Một là cơ bản một mảng các ký tự và khác là một chữ cái duy nhất, chữ số, vv. – Alan

+0

Tất nhiên! tôi đã nhận thấy chỉ có toán tử == trên String so sánh. Loại Char có thể được so sánh với toán tử ==, nhưng nó là một kiểu giá trị. Đúng? –

+0

Đây là loại giá trị, có – Alan

0

char loại doesnt có phương pháp Contains(), nhưng bạn có thể sử dụng iit như thế này: 'a'.ToString().Contains(...)

nếu không xem xét việc thực hiện, một cách đơn giản:

 var input = "janw doe"; 
     var people = new string[] { "abc", "123", "jane", "jane doe" }; 

     var found = Array.BinarySearch<string>(people, input);//or use FirstOrDefault(), FindIndex, search engine... 
     if (found < 0)//not found 
     { 
      var i = input.ToArray(); 
      var target = ""; 

      //most similar 
      //target = people.OrderByDescending(p => p.ToArray().Intersect(i).Count()).FirstOrDefault(); 

      //as you code: 
      foreach (var p in people) 
      { 
       var count = p.ToArray().Intersect(i).Count(); 
       if (count > input.Length/2) 
       { 
        target = p; 
        break; 
       } 
      } 

      if (!string.IsNullOrWhiteSpace(target)) 
      { 
       Console.WriteLine(target); 
      } 
     }