C# 如何比较两个字符串的int out错误?

C# 如何比较两个字符串的int out错误?,c#,string,diff,C#,String,Diff,我在网上搜索了一个diff算法,但没有一个能满足我的要求。这是一个短信比赛(在手机中),我需要的是参赛文本,而不是记录错误的主文本。我对C#还不太熟悉,我掌握了大部分字符串函数,没想到这会是一个很难解决的问题,但唉,我就是不知道该怎么做 我有一个表单,有两个富文本框(一个在另一个上面)和两个按钮。顶部框是主文本(字符串),底部框是输入文本(字符串)。每个参赛者都向一个电子邮件帐户发送一条文本,我们从电子邮件中将文本复制并粘贴到条目RTB中,并与主RTB进行比较。因为每一个单词和空格都是需要检查的

我在网上搜索了一个diff算法,但没有一个能满足我的要求。这是一个短信比赛(在手机中),我需要的是参赛文本,而不是记录错误的主文本。我对C#还不太熟悉,我掌握了大部分字符串函数,没想到这会是一个很难解决的问题,但唉,我就是不知道该怎么做

我有一个表单,有两个富文本框(一个在另一个上面)和两个按钮。顶部框是主文本(字符串),底部框是输入文本(字符串)。每个参赛者都向一个电子邮件帐户发送一条文本,我们从电子邮件中将文本复制并粘贴到条目RTB中,并与主RTB进行比较。因为每一个单词和空格都是需要检查的。一个词,不管有多少个错误,仍然是一个错误。对于每一个错误,增加1秒。到了他们的时代

示例:


  • 你好 一个简单的算法是逐字检查。如果字母不同,则增加错误数。如果下一对字母匹配,则它是一个已切换的字母,因此只需继续。如果该错误与下一个字母匹配,则为遗漏,并相应处理。如果下一个字母与混乱的字母匹配,则为插入字母,并进行相应处理。否则这个人就真的搞砸了,继续干下去

    这并不是全部,但经过一些修改,这可能会变得全面

    伪代码的微弱尝试: 编辑:新想法。看看评论。我脑子里不知道字符串的功能,所以你必须弄清楚那部分。这个算法对于重复次数很多的单词来说有点失败

    string entry; //we'll pretend that this has stuff inside
    string master; // this too...
    string tempentry = entry; //stuff will be deleted so I need a copy to mess up
    int e =0; //word index for entry
    int m = 0; //word index for master
    int errors = 0;
    while(there are words in tempentry) //!tempentry.empty() ?
      string mword = the next word in master;
      m++;
      int eplace = find mword in tempentry; //eplace is the index of where the mword starts in tempentry
      if(eplace == -1) //word not there...
        continue;
      else
         errors += m - e;
         errors += find number of spaces before eplace
         e = m // there is an error
         tempentry = stripoff everything between the beginning and the next word// substring?
    all words and spaces left in master are considered errors.
    

    这里有几个边界检查错误需要纠正,但这是一个好的开始。

    你需要想出一个适合你的情况的评分系统

    我会在每个空格后创建一个单词数组

    • 如果在同一索引中找到一个单词+5
    • 如果在同一索引+-1索引位置+3上发现一个单词(保留一个计数器,显示单词之间的差异,以增加+-校正)
    • 如果在另一个单词+2中找到所需的单词
    等等。匹配单词很难,使用一个有效的规则引擎“更容易”

    你研究过算法吗?它返回两个字符串之间的差异数,在你的例子中,这将是文本错误。基于维基百科页面上找到的伪代码实现算法将通过你的4个u中的前3个se案例:

    Assert.AreEqual(2, LevenshteinDistance("Hello there!", "Helothere!");
    Assert.AreEqual(1, LevenshteinDistance("Hello there!", "Hello there!!"));
    
    Assert.AreEqual(4, LevenshteinDistance("Hello there! How are you?", "Helothere!! How a re you?"));
    Assert.AreEqual(3, LevenshteinDistance("Hello there! How are you?", "Hello there!@ Ho are yu??"));  //fails, returns 4 errors
    
    因此,虽然这不是一个完美的开箱即用的方法,但对你来说可能是一个很好的起点。此外,如果你在执行评分规则方面有太多的困难,也许值得重新审视

    更新: 以下是您在注释中请求的字符串的结果:

    Assert.AreEqual(7, LevenshteinDistance("Hello there! How are you?", "Hlothere!! Hw a reYou?");  //fails, returns 8 errors
    
    下面是我对Levenshtein距离算法的实现:

    int LevenshteinDistance(string left, string right)
    {
        if (left == null || right == null)
        {
            return -1;
        }
    
        if (left.Length == 0)
        {
            return right.Length;
        }
    
        if (right.Length == 0)
        {
            return left.Length;
        }
    
        int[,] distance = new int[left.Length + 1, right.Length + 1];
    
        for (int i = 0; i <= left.Length; i++)
        {
            distance[i, 0] = i;
        }
    
        for (int j = 0; j <= right.Length; j++)
        {
            distance[0, j] = j;
        }
    
        for (int i = 1; i <= left.Length; i++)
        {
            for (int j = 1; j <= right.Length; j++)
            {
                if (right[j - 1] == left[i - 1])
                {
                    distance[i, j] = distance[i - 1, j - 1];
                }
                else
                {
                    distance[i, j] = Min(distance[i - 1, j] + 1,      //deletion
                                         distance[i, j - 1] + 1,      //insertion
                                         distance[i - 1, j - 1] + 1); //substitution
                }
            }
        }
    
        return distance[left.Length, right.Length];
    }
    
    int Min(int val1, int val2, int val3)
    {
        return Math.Min(val1, Math.Min(val2, val3));
    }
    
    int-levenshteindication(左字符串、右字符串)
    {
    如果(左==null | |右==null)
    {
    返回-1;
    }
    如果(left.Length==0)
    {
    返回权。长度;
    }
    if(right.Length==0)
    {
    返回左。长度;
    }
    int[,]距离=新int[left.Length+1,right.Length+1];
    
    对于(inti=0;i我曾经实现了一个算法(我现在找不到,找到它时我会发布代码),它查看目标字符串中的对总数。例如,“Hello,World!”将有11对,{“He”,“el”,“ll”,“ld”,“d!”}

    然后对输入字符串(如“Helo-World”)执行相同的操作,因此有{“He”,…,“ld”}


    然后,您可以根据正确对(即目标对列表中的输入对)、错误对(即目标对列表中不存在的输入对)计算精度,与目标对的总列表相比。在足够长的句子中,此度量将非常准确。

    长度差不会给你“int”的错误差!是的。但这不会增加我需要的错误,是吗?为什么Helo和Space有两个错误?这些错误不应该是Space和there!还是3个错误?你确定吗你不会有一个(第一个字符串)Hello here!(第二个字符串)here!@xanatos:这是一个类似于手机短信的短信比赛。规则是单个或整个单词出错1个,空格出错1个。因此在这个例子中,“Helo”拼写错误,空格不在那里。单词“there!”是完整的,没有输入错误,所以它是正确的。并且示例不是代码输出,它们是可以发送文本的。谢谢你的回复,但我不认为你像我开始时那样一路思考。我已经想过很多次这样做,但你必须看看可能出现的不同错误。M(你好!你好吗?).Stats是一样的,但是每出现一个错误,字符串索引就开始与master不匹配。错误是:Hello和there之间的空格!额外的!,里面有一个_space_。所以总共有3个错误。我仍然很困惑。这不是4个错误吗?没有空格,没有t,额外的!和额外的空格。或者你把单词当作最小的吗单位并检查单词是否有错?@datdo:我想是的。一个有一个或多个错误的单词仍然是一个错误。每个单词和每个空格最多等于一个错误。好吧,这个问题简化为确定单词的开头和结尾。我会看看我能想出什么,尽管我很确定这是一个NP完全问题。你可能会每次都必须尝试各种可能的组合,以使其完全正确。@datdo:NP?我担心这将比我想象的更让我感到沉重。我简直不敢相信以前没有做过这样的事情,至少有一些接近的事情。我的意思是,他们有显示颜色错误的打字程序,你可以更改操作错误级别控制的选项。这是w