差异比较逐字和显示变化

时间:2017-10-24 12:17:50

标签: c# asp.net-mvc levenshtein-distance string-metric

可以标记为重复,但我还没有找到适合的解决方案。

我需要编写一个逐字比较2个文本的函数,并打印出显示添加/删除/更改的单词的文本。例如:

  

StringOriginal ="我是蒂姆,我27岁"

     

StringEdited ="我是金,我不是那么老"。

     

结果:我 Tim Kim和我 27岁不是那么老。

我发现的大多数diff算法倾向于通过char比较char。这样可以正常工作,直到你在相同的索引上有两个不同的单词,并且有相互的字符。

"我是蒂姆"编辑到 "我是Kim" 结果成:

  

T Kim

而不是

  

Tim Kim。

任何指针?

4 个答案:

答案 0 :(得分:0)

按空格分割StringOriginal和StringEdited。循环遍历StringOriginal的每个单词,将其与Edited中的相同单词索引进行比较。每个不相等的单词都应该放在一个临时变量中,并且只有当你从循环中再次得到相同的单词时才将它连接到结果中。使用StringBuilder创建结果。希望这有帮助

答案 1 :(得分:0)

按空格分割两个字符串,通过Union连接生成的数组,然后返回到字符串,如下所示:

string[] arr1 = str1.Split(' ');
string[] arr2 = str1.Split(' ');

var merged = arr1.Union(arr2).ToArray<string>();

var mergedString = string.Join(' ', merged);

答案 2 :(得分:0)

有点旧时尚,但你可以尝试一下。

    string StringOriginal = "I am Tim and I am 27 years old";
    string StringEdited = "I am Kim and I am not that old";

    string[] StringOriginalArray = StringOriginal.Split();
    string[] StringEditedArray = StringEdited.Split();
    string[] newStringArray = new string[StringOriginalArray.Length + StringEditedArray.Length];

    int i = 0;
    int io = 0;
    int ie = 0;

    while (i < newStringArray.Length)
    {
        if (io < StringOriginalArray.Length)
        {
            newStringArray[i] = StringOriginalArray[io];
            io++;
            i++;
        }
        if (ie < StringEditedArray.Length)
        {
            newStringArray[i] = StringEditedArray[ie];
            ie++;
            i++;
        }
    }

    string[] finalArray = new string[newStringArray.Length];
    int f = 0;
    for (int k = 0; k < newStringArray.Length; k=k+2)
    {
        finalArray[f++] = newStringArray[k];
        if (newStringArray[k] != newStringArray[k+1])
        {
            finalArray[f++] = newStringArray[k+1];
        }
    }

    Console.WriteLine(String.Join(" ", finalArray));

输出:

"I am Tim Kim and I am 27 not years that old"

答案 3 :(得分:0)

我自己正在寻找这个问题的答案。 一直找不到一个好的解决方案。 提出了以下内容。但这并不完美。

interface IImageUrls {
  regular: string;    
}