找出2个字符串的差异

Finding the difference in 2 strings

我在 PowerPoint 中有 2 个文本框。一份原创,一份编辑。我将它们串起来并将它们分别分解成一个数组。然后我比较它们是否有任何差异。例如,我的原始文本框有 "This New",而我的编辑文本框有 "Thisss Blaa",然后输出为 "This Thisss New Blaa"。但是,当我原来的 TextBox 有两次相同的词时,例如"This This" 我的输出是 "This Thiss Blaa" 而它应该是 "This Thiss This Blaa"。只有当我在一个字符串中有 2 个相同的单词时才会发生这种情况。有没有人知道如何解决这个问题?

我的代码如下

            var q = from original in originalList
                    join editedTmp in editList on original.Id equals editedTmp.Id into g
                    from edited in g.DefaultIfEmpty()
                    select new
                    {
                        original,
                        edited
                    };
            foreach (var item in q)
            { 



            char delimiter = Convert.ToChar(" ");
            var originalString = item.original.TextFrame.TextRange.Text;
            var editString = item.edited.TextFrame.TextRange.Text;

            var firstStringList = originalString.Split(delimiter).ToList();

            var secondStringList = editString.Split(delimiter).ToList();


            foreach (var word in firstStringList)
            {
                if (secondStringList.IndexOf(word) == -1)
                {




                    var indexOfWord = firstStringList.IndexOf(word); //gets the position of the edited word eg. 3.
                                                                     // using indexOfWord+indexOfWord as I need do this if more than one word is added.
                    secondStringList.Insert(indexOfWord + indexOfWord, word);

                    // Insert the word that was not found at position 3 inside secondStringList

                    one.Add(word);


                    }
            }

所以,我想你想要:

字符串 1:This This 字符串 2:Thisss blaa

结果:This Thisss This Blaa.

我实现这一点的最简单方法是:

var first = "This This";
var second = "Thisss blaa";

var firstSplit = first.SplitBySpace();
var secondSplit = second.SplitBySpace();

var result = string.Join(" ", firstSplit.Zip(secondSplit, (firstString, secondString) => firstString + " " + secondString));
// result = "This Thisss This Blaa"

SplitBySpace是这样的:

public static class StringExtensions
{
    public static IEnumerable<string> SplitBySpace(this string value)
    {
        return value.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
    }
}

说明

.Zip 接受两个数组并将相同位置的每个元素连接在一起。所以相当于做:

for (var i = 0; i < arr1.Length; i++)
{
    var newElement = arr1[i] + arr2[i]
    arr3[i] = newElement;
}
// arr1.Length = 10, arr2.Length = 10;
// arr3.Length = 10!

但是,使用 .Zip() 的第二个参数,您可以定义创建新元素的方式。

整合

var q = from original in originalList
        join editedTmp in editList on original.Id equals editedTmp.Id into g
        from edited in g.DefaultIfEmpty()
        select new
        {
            original,
            edited
        };

foreach (var item in q)
{ 
    var originalString = item.original.TextFrame.TextRange.Text;
    var editString = item.edited.TextFrame.TextRange.Text;
    var firstSplit = originalString .SplitBySpace();
    var secondSplit = editString .SplitBySpace();

    var result = string.Join(" ", firstSplit.Zip(secondSplit, (firstString, secondString) => firstString + " " + secondString));

    Console.WriteLine(result);
}