-4

我在按下按钮时有 2 个文本框(winforms 应用程序)我有以下代码:

        string new_text = txtnew.Text;
        string old_text = txtold.Text;

        char[] arr_new = new_text.ToCharArray();
        char[] arr_old = old_text.ToCharArray();
        double found  = 0.0;
        double not_found = 0.0;
        foreach (char c_old in arr_old)
        {
            foreach (char c_new in arr_new)
            {
                if (c_new == c_old)
                {
                    found++;
                }else{
                    not_found++;
                }
            }
        }
        double percentage //need help here..
        MessageBox.Show(percentage.ToString());

我一直在尝试做的是比较每个数组以查看来自 1 个数组的字符是否存在于另一个数组中,然后它应该以百分比形式输出差异。因此,如果 txtNew = "hello worl" 和 txtold="hello world" 那么差异会是 0.1% 吗?无论如何,它被修改得越多,差异就越大,直到它处于 60% 不同的安全状态。

4

3 回答 3

2

您可以通过除以not_found总数来计算百分比,如下所示:

double percentage = (100.0 * not_found) / (found + not_found);

更精确的方法是计算字符串之间的编辑距离,然后用原始字符串长度的百分比表示该距离(即使用编辑距离而不是not_found)。

于 2012-11-16T19:14:32.353 回答
0

如果您not_found在内部循环中增加,它将达到old_text.Length*new_text.Length. 这将产生巨大的not_found数字,使您获得的百分比比我认为的要小得多。

也没有必要做 char 数组的东西,内部可以被IndexOf调用替换:

    string new_text = txtnew.Text;
    string old_text = txtold.Text;

    var found = 0;
    foreach (var c_old in old_text)
    {
        if (new_text.IndexOf(c_old) != -1)
        {
          found++;
        }
    }
    //percentage of characters in the old text that also appear in the new text
    double percentage = (100d * found) / old_text.Length;    
    MessageBox.Show(percentage.ToString());
于 2012-11-16T19:23:38.300 回答
0

看看这个维基百科页面: Damerau-Levenshtein distance

该页面上提供了一个 C# 函数,我认为它完全符合您的要求。

编辑:刚刚意识到其他人已经提到了同样的算法,抱歉重复了。

于 2012-11-16T20:02:18.300 回答