2012-10-16 20 views
5

Ich versuche eine Vorschlagsfunktion für die Suchfunktion in meinem Programm zu haben, zB schreibe ich Janw Doe in den Suchbereich und es wird NO MATCH ausgegeben - meinst du Jane Doe? Ich bin mir nicht sicher, was das Problem ist, vielleicht etwas mit Char/String-Vergleich zu tun .. Ich habe versucht, beide Variablen als Typ char vergleichen zB char temp -> temp.Contains ... etc, aber ein Fehler erscheint (char enthält keine Definition für Enthält). Würde mich über jede Hilfe freuen! 8)Char/String Vergleich

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

Ihre Frage ist nicht sehr klar, mit welcher Codezeile hast du Probleme? – Alan

Antwort

6

Eine Zeichenfolge besteht aus vielen Zeichen. Ein Charakter ist ein Primitiv, er enthält auch keine anderen Gegenstände. Eine Zeichenfolge ist im Grunde eine Reihe von Zeichen.

Bei String-Vergleich und Zeichen:

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

Oder wenn Sie einen einstelligen Zeichenfolge haben .. Ich nehme an

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

All dies behauptet wahr sind

Aber die Haupt Der Grund, warum ich Ihre Frage kommentieren wollte, ist eine alternative Herangehensweise für das Vorschlagen von "Meinten Sie?". Es gibt einen Algorithmus namens Levenshtein Distance, der die Anzahl der einzelnen Zeichen berechnet, die benötigt werden, um eine Zeichenfolge in eine andere zu konvertieren. Es kann als Maß dafür verwendet werden, wie nahe zwei Saiten sind. Vielleicht möchten Sie untersuchen, wie dieser Algorithmus funktioniert, weil er Ihnen helfen könnte.

Hier ist ein Applet, das ich gefunden, was zeigt: Approximate String Matching with k-differences

Auch der Wikipedia-Link Levenshtein distance

+0

Ich schaue mir den Algorithmus an, S sieht kompliziert aus O_o. Ich werde dich wissen lassen, wie es läuft. :) – Quigg15405

+0

Der Algorithmus ist eigentlich ziemlich einfach, vielleicht sehen Sie, ob Sie ein besseres Applet finden können, das Sie Schritt-für-Schritt zeigt – Alan

0

Char-Typ nicht .Contains() haben kann, weil nur 1 char-Wert-Typ.

In Ihrem Fall (wenn ich verstehe), müssen Sie vielleicht .Equals() oder == Operator verwenden.

Hinweis: für String richtig vergleichen zu können, verwenden .Equals(), die == Betreiber nicht in diesem Fall gut arbeiten, weil String Referenztyp ist.

Hoffe diese Hilfe!

+0

Sie können zwei Zeichen mit dem Operator == vergleichen. Der Schlüssel ist, dass ein String nicht gleich einem Zeichen sein kann. Man ist im Grunde eine Reihe von Zeichen und andere ist ein einzelner Buchstabe, Ziffer usw. – Alan

+0

Natürlich! Ich habe nur den ==-Operator beim String-Vergleich bemerkt. Der Char-Typ kann mit dem Operator == verglichen werden, ist jedoch ein Werttyp. Recht? –

+0

Es ist ein Werttyp, ja – Alan

0

char Typ dosen't haben die Contains() Methode, aber Sie können iit wie folgt verwenden: 'a'.ToString().Contains(...)

wenn nicht die Leistung betrachten, eine andere einfache Art und Weise:

 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); 
      } 
     }