2017-10-24 1 views
1

Könnte als dupliziert markiert werden, aber ich habe noch keine Lösung gefunden.Diff-Vergleich Wort für Wort und Anzeigeänderungen

Ich muss eine Funktion schreiben, die 2 Textteile Wort für Wort vergleicht und den Text mit den hinzugefügten/gelöschten/geänderten Wörtern ausdruckt. Zum Beispiel:

StringOriginal = "Ich bin Tim und ich bin 27 Jahre alt"

StringEdited = "Ich bin Kim und ich bin nicht so alt".

Ergebnis: Ich bin Tim Kim und ich bin 27 Jahre nicht so alt.

Die meisten Diff-Algorithmen, die ich finde, neigen dazu, char by char zu vergleichen. das funktioniert gut, bis Sie zwei verschiedene Wörter auf dem gleichen Index haben, mit gemeinsamen Zeichen.

"Ich bin Tim", herausgegeben an "Ich bin Kim" Ergebnisse in:

Ich bin T Kim

statt

Ich bin Tim Kim.

Irgendwelche Zeiger?

Antwort

0

Split von Leerzeichen sowohl StringOriginal und StringEdited. Schleife durch jedes Wort von StringOriginal Vergleich mit dem gleichen Wortindex von Edited. Jedes ungleiche Wort sollte in eine temporäre Variable eingegeben und nur dann mit dem Ergebnis verkettet werden, wenn Sie aus der Schleife wieder das gleiche Wort erhalten. Verwenden Sie StringBuilder zum Erstellen des Ergebnisses. Hoffe, das hilft

+0

Danke, habe begonnen, mich! –

0

Split beide Strings durch den Raum, die sich daraus ergebenden Arrays über Union beitreten zu bespannen, dann wieder wie folgt aus:

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

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

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

Das hat nicht funktioniert. –

0

wenig altmodisch, aber man kann versuchen, diese.

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)); 

Ausgang:

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

Das funktioniert! Ich muss es nur bearbeiten, um hinzugefügte/gelöschte Wörter in grün/rot in meiner asp.net Anwendung hervorzuheben! Vielen Dank! –

+0

Gern geschehen! –

Verwandte Themen