字符/字符串比较

问题描述:

我试图在我的程序中为搜索功能提供一个建议功能,例如我在搜索部分输入janw doe,它会输出无匹配 - 你的意思是jane doe?我不知道是什么问题,也许是做什么与字符/字符串比较..我试着将两个变量作为类型字符比如char temp - > temp.Contains ...等,但出现错误(char不包含Contains的定义)。会喜欢这方面的任何帮助! 8)字符/字符串比较

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

你的问题不是很清楚,你遇到什么问题? – Alan

一个字符串由许多字符组成。一个角色是一个原始的,同样,它不包含任何其他项目。一个字符串基本上是一个字符数组。

对于比较字符串和字符:

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

或者,如果你有一个单一的数字串。我想

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

所有这些断言是真的

但是,主我想对你的问题发表评论的原因,是提出一种替代方法来暗示“你的意思是?”。有一种称为Levenshtein Distance的算法,用于计算将一个字符串转换为另一个字符串所需的“单个字符编辑数量”。它可以用来衡量两个琴弦有多接近。你可能想看看这个算法是如何工作的,因为它可以帮助你。

这里有一个小程序,我发现这表明:Approximate String Matching with k-differences

而且*的链接Levenshtein distance

+0

我会看看算法; S看起来很复杂O_o。我会让你知道它是怎么回事。 :) – Quigg15405

+0

算法实际上非常简单,也许看看您是否可以找到一个更好的小程序来向您显示步骤 – Alan

char类型不能有.Contains(),因为只有1个char值类型。

在你的情况(如果我明白),也许你需要使用.Equals()==运营商。

注:正确地比较字符串,使用.Equals(), 的==运营商并不在这种情况下工作良好,因为String是引用类型。

希望得到这个帮助!

+0

您可以使用==运算符比较两个字符。关键是一个字符串不能等于一个字符。一个基本上是一组字符,另一个是单个字母,数字等。 – Alan

+0

当然!我注意到只有==运算符比较字符串。 Char类型可以与==运算符进行比较,但是它是一个值类型。对? –

+0

这是一个值类型,是 – Alan

char型这么想的有Contains()方法,但是你可以用个人所得税是这样的:'a'.ToString().Contains(...)

如果不考虑性能,另一种简单的方法:

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