C# 在Interop C中查找两个文本框中的差异

C# 在Interop C中查找两个文本框中的差异,c#,interop,indexof,C#,Interop,Indexof,我有两个PowerPoint演示文稿,一个是原创的,一个是经过编辑的,每个演示文稿中都有一个文本框 这样做的目的是找到任何不匹配的文本。当我在两个文本框中找到不匹配的文本时,我会在编辑过的演示文稿的文本框中找到编辑过的单词的位置,并将该单词添加到原始演示文稿的文本框中 e、 在我的原始演示文稿中有一个文本框,其中包含“这是新的”,在我编辑的演示文稿中,我有一个文本框“这是Blaaa”。当我运行我的代码时,我得到以下信息:thissss是新的Blaaa。这一切都很好,但是当我在我的原始PowerP

我有两个PowerPoint演示文稿,一个是原创的,一个是经过编辑的,每个演示文稿中都有一个文本框

这样做的目的是找到任何不匹配的文本。当我在两个文本框中找到不匹配的文本时,我会在编辑过的演示文稿的文本框中找到编辑过的单词的位置,并将该单词添加到原始演示文稿的文本框中

e、 在我的原始演示文稿中有一个文本框,其中包含“这是新的”,在我编辑的演示文稿中,我有一个文本框“这是Blaaa”。当我运行我的代码时,我得到以下信息:thissss是新的Blaaa。这一切都很好,但是当我在我的原始PowerPoint中有一个文本框和字符串This This,以及一个编辑过的文本框说thisss Blaa时,我应该得到这个thisss这个Blaa,但是我得到的是这个thisss Blaa。由于某些原因,它无法从原始文本框中获取第二个文本。有没有办法解决这个问题

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 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);
        }
    }
    // Join the secondStringList to make 1 string separated by the space character
    item.edited.TextFrame.TextRange.Text = string.Join(" ", secondStringList);
}

您可以在foreach循环外部声明indexoford,并对自己进行计数,以使变量保存当前索引,而不是通过IndexOf在firstStringList中获取“current”索引

否则,firstStringList.IndexOf将返回当前字符串的第一次出现

此外,您可以将该索引作为第二个参数传递给secondStringList.IndexOf,以确保不会获得已插入字符串的索引

int indexOfWord=0;
foreach (var word in firstStringList)
{
    if (secondStringList.IndexOf(word,indexOfWord) == -1)
    {
        // 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);
    }
    indexOfWord++;
}

不确定这是否适用于所有情况,但对于给定的示例,它对我来说效果很好。

我认为如果您有两个相同的单词,则不会执行if secondStringList.indexoford==-1{…}。@Madenis是的,我认为是这样的。有什么办法可以解决这个问题吗?那就是返回了这个Blaa而不是这个Blaa。这种情况发生在你身上了吗?这个词很好,每个演示文稿上都有一个文本框,但是如果你有多个文本框,它就不起作用了。您得到一个参数超出范围异常。有没有关于如何解决这个问题的想法?