我按下按钮时有2个文本框(winforms app)我有以下代码:
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%不同的安全状态。
答案 0 :(得分:2)
您可以通过将not_found
除以总计来计算百分比,如下所示:
double percentage = (100.0 * not_found) / (found + not_found);
更精确的方法是计算字符串之间的Edit Distance,然后根据原始字符串长度的百分比表示该距离(即使用编辑距离而不是{ {1}})。
答案 1 :(得分: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());
答案 2 :(得分:0)
看看这个维基百科页面: Damerau-Levenshtein distance
在该页面上提供了一个C#功能,我认为这正是您正在寻找的。 p>
编辑:刚刚意识到其他人已经提到了同样的算法,对不起重复。