2012-10-16 20 views
5

Programımdaki arama fonksiyonu için bir öneri özelliğine sahip olmaya çalışıyorum, örneğin arama bölümünde janw doe yazdım ve HAYIR çıkacak çıktı - jane doe demek istedin mi? Sorunun ne olduğundan emin değilim, belki char/string karşılaştırması ile ilgili bir şey ... Ben char türünde char türünde her iki değişkenleri karşılaştırmayı denedim -> temp.Contains ... vb ama bir hata (char İçindekiler için bir tanım içermez). Bu konuda herhangi bir yardım isterim! 8)Char/String karşılaştırması

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

Sorunuz çok değil Açık, hangi kod ile sorun yaşıyorsunuz? – Alan

cevap

6

Bir dize çok sayıda karakterden oluşur. Bir karakter bir ilkeldir, aynı şekilde başka bir öğe "içermez". Bir dize temel olarak bir dizi karakterdir. dize ve karakterleri karşılaştırmak için

: Bir tek haneli dizesi varsa

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

Ya .. ben Bunların hepsi iddia

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

Ama asıl doğruysa varsayalım Sorunuz hakkında yorum yapmak istediğim sebep, "Bunu mu demek istediniz?" önerisine alternatif bir yaklaşım önermek. Bir dizgiyi diğerine dönüştürmek için gerekli olan "tek karakter düzenlemelerinin sayısını" hesaplayan Levenshtein Distance adlı bir algoritma var. İki dizenin ne kadar yakın olduğunun bir ölçüsü olarak kullanılabilir. Bu algoritmanın size nasıl yardımcı olabileceğine bakmak isteyebilirsiniz. Approximate String Matching with k-differences

sadece 1 karakter değer türü olduğundan Ayrıca wikipedia bağlantı Levenshtein distance

+0

Algoritmaya bir bakacağım, S karmaşık O_o'ya benziyor. Nasıl gittiğini size bildiririm. :) – Quigg15405

+0

algoritması aslında oldukça basittir, belki de adım adım – Alan

0

Char tipi .Contains() olamaz:

İşte gösteriyor buldum bir uygulama bu.

Sizin durumunuzda (anlıyorsam), belki .Equals() veya == işlecini kullanmanız gerekir.

Not: .Equals() kullanmak doğru dize karşılaştırmak için String başvuru türü olduğu için, == operatör bu durumda iyi çalışmaz.

Umut bu yardım!

+0

gösteren daha iyi bir uygulama bulabilirseniz bakın == operatör ile iki karakteri karşılaştırabilirsiniz. Anahtar, bir String'in bir Karaktere eşit olamamasıdır. Biri temel olarak bir dizi karakter ve diğeri ise tek bir harf, rakam, vb. – Alan

+0

Elbette! Sadece String karşılaştırmasında == operatörünü fark ettim. Char tipi, == operatörü ile karşılaştırılabilir, ancak bir değer türüdür. Sağ? –

+0

Bu bir değer türüdür, evet – Alan

0

char tip dosen't Contains() yöntemi var ama böyle IIT kullanabilirsiniz: performansı dikkate yoksa, 'a'.ToString().Contains(...)

başka basit bir yol:

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