2012-10-16 12 views
5

Próbuję mieć funkcję sugestii dla funkcji wyszukiwania w moim programie, np. Wpisuję janw doe w sekcji wyszukiwania i wyświetli ona NO MATCH - czy miałeś na myśli Jane Doe? Nie jestem pewien, co to jest problem, może coś zrobić z porównania char/string. Próbowałem porównać obie zmienne jako typ char, np. Char temp -> temp.Contains ... etc, ale pojawia się błąd (char nie zawiera definicji dla Contains). Chciałbym pomóc w tej sprawie! 8)Char/String comparison

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

Twoje pytanie nie jest bardzo jasne, z jaką linią kodu masz problemy? – Alan

Odpowiedz

6

Ciąg składa się z wielu znaków. Postać jest prymitywna, podobnie nie "zawiera" żadnych innych przedmiotów. Łańcuch to w zasadzie tablica znaków.

do porównywania i ciąg znaków:

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

Lub jeśli masz jeden ciąg cyfr .. Przypuszczam

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

Wszystko to podnosi są prawdziwe

Ale głównym powodem, dla którego chciałem skomentować twoje pytanie, jest zasugerowanie alternatywnego podejścia do sugerowania "Czy miałeś na myśli?". Istnieje algorytm o nazwie Levenshtein Distance, który oblicza "liczbę pojedynczych zmian postaci" wymaganych do konwersji jednego ciągu znaków na inny. Może być używany jako miara bliskości dwóch ciągów. Możesz zajrzeć do tego, jak działa ten algorytm, ponieważ może ci pomóc.

Oto aplet że znalazłem który pokazuje: Approximate String Matching with k-differences

także link wikipedia Levenshtein distance

+0

Spojrzę na algorytm, S wygląda na skomplikowaną O_o. Dam ci znać, jak to działa. :) – Quigg15405

+0

Algorytm jest całkiem prosty, może zobaczymy, czy można znaleźć lepszy aplet, który pokazuje krok po kroku – Alan

0

typ Char nie może mieć .Contains() ponieważ jest jedynym rodzajem wartość 1 char.

W twoim przypadku (jeśli rozumiem), być może musisz użyć operatora .Equals() lub ==.

Uwaga: dla porównania String poprawnie, należy .Equals(), operator == nie działa dobrze w tym przypadku, ponieważ String jest typ referencyjny.

Mam nadzieję, że ta pomoc!

+0

Można porównać dwa znaki za pomocą operatora ==. Kluczem jest to, że Ciąg nie może być równy Znakowi. Jedna to w zasadzie tablica znaków, a druga to pojedyncza litera, cyfra itd. – Alan

+0

Oczywiście! zauważyłem tylko operatora == podczas porównywania ciągów. Typ Char można porównać z operatorem ==, ale jest to typ wartości. Dobrze? –

+0

To jest typ wartości, tak – Alan

0

char typ nie robi mieć metodę Contains(), ale można użyć IIT tak: 'a'.ToString().Contains(...)

jeśli nie biorą pod uwagę wydajność, inny prosty sposób:

 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); 
      } 
     } 
Powiązane problemy