我正在尝试为我的程序中的搜索功能提供一个建议功能,例如我在搜索部分输入janw doe并输出NO MATCH - 你的意思是jane doe?我不确定问题是什么,可能与char / string比较有关..我尝试将两个变量比较为char类型,例如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 :(得分:8)
字符串由许多字符组成。字符是基元,同样,它不“包含”任何其他项。字符串基本上是一个字符数组。
用于比较字符串和字符:
char a = 'A';
String alan = "Alan";
Debug.Assert(alan[0] == a);
或者如果你有一个数字字符串..我想
char a = 'A';
String alan = "A";
Debug.Assert(alan == a.ToString());
所有这些断言都是真的
但是,我想对你的问题发表评论的主要原因是建议另一种方法来建议“你的意思是什么吗?”。有一种称为Levenshtein Distance的算法,它计算将一个字符串转换为另一个字符串所需的“单个字符编辑的数量”。它可以用来衡量两个字符串的接近程度。您可能希望了解此算法的工作原理,因为它可以帮助您。
这是我发现的applet,它展示了:Approximate String Matching with k-differences
维基百科链接Levenshtein distance
答案 1 :(得分:0)
Char类型不能有.Contains()
,因为只有1个char值类型。
在您的情况下(如果我了解),您可能需要使用.Equals()
或==
运营商。
注意:要正确比较String,请使用.Equals()
,
==
运算符在这种情况下效果不佳,因为String
是引用类型。
希望这有帮助!
答案 2 :(得分:0)
char
类型不具备Contains()
方法,但您可以像这样使用iit:'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);
}
}