0

我有以下代码:

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
            }
        }
    }

关键位在底部带有注释删除,插入和替换,我想知道如何在其上添加变量增量器,以便每次检测到删除错误时变量增加一。我试过了:

{           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
}

但只是没有运气

4

2 回答 2

0

正如 Eric 所说:将语句拆分为多个。

    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++;
    }

确定它会做和以前一样的事情,但我不知道你想计算什么,因为所有行总是被执行。

于 2013-03-22T20:12:16.170 回答
-1

我同意@Eric 和@usr 的观点,但以防万一你一心只想在一个声明中这样做(我知道单行者的心态,我自己就是它的受害者!),你可以这样做(免责声明:我没有测试过):

Math.Min(d[i, j - 1] + 1 + (++insertion - insertion)

++ 增加插入值并返回新值。所以它会像 x - x = 0,因此不会影响更大的语句。

编辑

对不起大家。该解决方案仅适用于执行短路的三元运算符,而 OP 的问题使用函数调用,因此每次都会进行评估,从而杀死计数器的目的。

于 2013-03-22T20:12:50.860 回答