2017-02-08 1 views
0

J'ai 2 présentations PowerPoint un original et un édité et dans chacun d'eux j'ai un TextBox. L'idée est de trouver n'importe quel texte qui ne correspond pas. Quand je trouve le texte qui ne correspond pas dans les 2 TextBox es je trouve la position du mot édité dans le TextBox dans la présentation édité et ajouter ce mot à la zone de texte de présentation originaleTrouver les différences dans 2 Textboxes Interop C#

par exemple, dans ma présentation originale a un TextBox qui contient "This is New" et dans ma présentation éditée j'ai "Thisssss is Blaaa". Quand je cours mon code, je reçois ce qui suit: "This Thisssss New New Blaaa". Cela fonctionne bien cependant quand j'ai un TextBox dans mon PowerPoint original avec la chaîne "This This" et un TextBox édité disant "Thissss Blaa" je devrais obtenir "This Thissss cette Blaa" cependant j'obtiens "This Thissss Blaa" à la place. Il ne reçoit pas la deuxième "Ceci" de l'original TextBox pour une raison quelconque. Des idées comment je pourrais résoudre ce problème?

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

Je pense que si vous avez 2 mêmes mots, le 'if (secondStringList.IndexOf (word) == -1) {...}' n'est pas exécuté. – Madenis

+0

@Madenis oui je pense que c'est le cas. Des idées de comment je pourrais résoudre cela? –

Répondre

1

Au lieu d'obtenir l'indice « courant » dans firstStringList via IndexOf, vous pouvez déclarer indexOfWord en dehors de la boucle foreach et comptez vous-même si la variable contient l'indice actuel.

Sinon, firstStringList.IndexOf() renverra le premier l'occurence de la chaîne en cours.

En outre, vous pouvez passer cet index en tant que deuxième paramètre à secondStringList.IndexOf() pour vous assurer que vous n'obtenez pas l'index d'une chaîne déjà insérée.

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

Je ne sais pas si cela fonctionne dans tous les cas, mais avec l'exemple donné, cela a bien fonctionné pour moi.

+0

Cela a renvoyé 'This This Thiss Blaa' au lieu de' This Thiss This Blaa'. Est-ce que cela s'est passé pour vous? –

+0

Ok, peu importe que cela a fonctionné: P –

+0

Merci beaucoup :) –