我有以下代码:
public static int Compute(string a, string b, bool ignoreCase)
{
// Allocate distance matrix
int[,] d = new int[a.Length + 1, b.Length + 1];
// Get character comparer
CharComparer isEqual = (ignoreCase) ?
(CharComparer)CharCompareIgnoreCase : CharCompare;
// Compute distance
for (int i = 0; i <= a.Length; i++)
d[i, 0] = i;
for (int j = 0; j <= b.Length; j++)
d[0, j] = j;
for (int i = 1; i <= a.Length; i++)
{
for (int j = 1; j <= b.Length; j++)
{
if (isEqual(a[i - 1], b[j - 1]))
{
// No change required
d[i, j] = d[i - 1, j - 1];
}
else
{
d[i, j] =
Math.Min(d[i - 1, j] + 1, // Deletion
insertions= Math.Min(d[i, j - 1] + 1, // Insertion
substitutions= d[i - 1, j - 1] + 1)); // Substitution
}
}
}
关键位在底部,注释删除,插入和替换,我想知道如何在其上添加变量incrementor,因此每次检测到删除错误时,变量增加1。我试过了:
{ d[i, j] =
deletion= Math.Min(d[i - 1, j] + 1, // Deletion
insertions= Math.Min(d[i, j - 1] + 1 + insertion ++, // Insertion
substitutions= d[i - 1, j - 1] + 1)); // Substitution
}
但是没有运气
答案 0 :(得分:0)
正如埃里克所说:将声明分成多个声明。
else
{
substitutions = d[i - 1, j - 1] + 1;
insertions = Math.Min(d[i, j - 1] + 1, substitutions);
deletion = Math.Min(d[i - 1, j] + 1, insertions);
d[i, j] = deletion;
if (/* whatever */)
counter++;
}
我非常确定它会像以前一样做,但我不知道你想要计算什么,因为所有行总是被执行。
答案 1 :(得分:-1)
我同意@Eric和@usr,但为了防止你在一个声明中这么做(我知道单行的心态,我自己也是它的受害者!),你可以做它(免责声明:我还没有测试过):
Math.Min(d[i, j - 1] + 1 + (++insertion - insertion)
++,增加插入值并返回新值。所以它就像x - x = 0,因此不会影响较大的声明。
修改强>
对不起伙计们。该解决方案仅适用于执行短路的三元运算符,而OP的问题使用函数调用,因此每次都会消失,从而扼杀了计数器的目的。