9

我试图在我的程序中为搜索功能提供建议功能,例如,我在搜索部分输入 janw doe,它会输出 NO MATCH - 你是说 jane doe 吗?我不确定问题是什么,可能与字符/字符串比较有关..我尝试将两个变量都比较为 char 类型,例如 char temp -->temp.Contains ...etc 但出现错误(char不包含包含的定义)。希望有任何帮助!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]);
                }
///////////////////////////////////////////////////////////////////////////////////////////////////
4

3 回答 3

10

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

比较字符串和字符:

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

于 2012-10-16T01:32:45.470 回答
0

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

在您的情况下(如果我理解),也许您需要使用.Equals()==操作员。

注意:为了正确比较字符串,请使用.Equals()==运算符在这种情况下不起作用,因为String它是引用类型。

希望这有帮助!

于 2012-10-16T01:33:02.880 回答
0

chartype 没有该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);
            }
        }
于 2017-07-13T08:46:44.503 回答