2017-09-23 3 views
-3

ich wiezwei String-Vergleichen Sie den Unterschied

zwei Strings vergleichen wollen, sollten
string1 = "My Name is Something. I do nothing" 
string2 = "My Name is Momething. I do othing" 

und das Ergebnis "My Name ist Momething. Ich mache othing"

der Unterschied im Wort sollte in unterschiedlicher Schriftart oder Farbe angezeigt werden

ich versuchte

var difference = string1.Except(string2).ToArray()  

, die die Anordnung von diffence geben

+0

zu tun Was haben Sie bisher versucht? – ne1410s

+0

Ich versuchte dies "var difference = string1.Except (string2). ToArray()" dies wird das Array von Differenzen geben – Ravi

+0

Kann mir jemand sagen, warum downvoted ?? – Ravi

Antwort

3

Mit Except auf einer Sammlung nimmt alle Elemente der ersten Sammlung außer (von Typen Gleichheit) Elemente in der zweiten. Als Ihre Typen sind string s sie sind Sammlungen von char s. Du willst nicht Except, sondern prüfen, welche Wörter unterschiedlich sind.

Verwenden Split eine Sammlung von Zeichenketten zu erhalten, wobei jedes ein Wort, und dann Zip verwenden Worte von derselben Position im Satz zu vergleichen:

var string1 = "My Name is Something. I do nothing"; 
var string2 = "My Name is Momething. I do othing"; 

var result = string1.Split(' ').Zip(string2.Split(' '), (s1, s2) => new { s1, s2 }) 
        .Where(p => p.s1 != p.s2); 

Wenn Sie sicherstellen möchten Sie tun nicht Abschnitte nur Räume haben, können Sie wie diese spalten:

Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) 

Um es mit Markierung der Unterschiede in einem einzelnen String zurücklegen (zB mit <b> für HTML-Umgebung fett Sie dies tun können:

var result = string.Join(" ", string1.Split(' ') 
         .Zip(string2.Split(' '), (s1, s2) => new { s1, s2 }) 
         .Select(pair => pair.s1 != pair.s2 ? $"<b>{pair.s2}</b>" : pair.s1)); 
+0

{System.Linq.Enumerable.WhereEnumerableIterator <<> f__AnonymousType0 >} in Ergebnis – Ravi

+0

Ich bekomme dies in var Ergebnis – Ravi

+0

@Ravi - das ist, weil Linq ausgeführt ausgeführt wird. Add 'ToList()' oder beim Debuggen die 'Ergebnisansicht' anzeigen - es führt die Abfrage und zeigt Ihnen die Ergebnisse –

0

versuchen dies, diesen Code zu vergleichen, Wort für Wort, gleich, wenn die Zeichenfolge tun sie nicht gleiche Wörter Nummer haben:

string string1 = "My Name is Something. I do nothing tessst"; 
string string2 = "My Name is Momething. I do othing"; 

//Trasnforme string to list with space like separator, and compare string by position 
var List1 = string1.Split(' ').Select((valuestring1, index) => new { valuestring1, index }); 
var List2 = string2.Split(' ').Select((valuestring2, index) => new { valuestring2, index }); 

//Left outer join 
var leftdifference = from word1 in List1 
        from word2 in List2.Where(word2 => word1.index == word2.index).DefaultIfEmpty() 
        where word2 == null || word1.valuestring1 != word2.valuestring2 
        select new { word1, word2 }; 

//Right outer join 
var rightdifference = from word2 in List2 
         from word1 in List1.Where(word1 => word1.index == word2.index).DefaultIfEmpty() 
        where word1 == null || word1.valuestring1 != word2.valuestring2 
         select new { word1, word2 }; 

var fulldifference = leftdifference.Union(rightdifference).ToList(); 

foreach (var item in fulldifference) 
{ 
    string val1 = item.word1 == null ? "NOT PRESENT WORD" : item.word1.valuestring1; 
    string val2 = item.word2 == null ? "NOT PRESENT WORD" : item.word2.valuestring2; 
    int index = item.word1 == null ? item.word2.index : item.word1.index; 

    Console.WriteLine("position {0}, string1 : '{1}' , string2 : '{2}'", index, val1, val2); 
} 
0

ich weiß nicht, ob Sie diese auf Web oder etwas anderes versuchen, für Konsole App:


string[] strArr1 = string1.Split(' ').ToArray(); 
string[] strArr2 = string2.Split(' ').ToArray(); 

for (int i = 0; i < strArr1.Length; i++) 
{ 
    if(string.Compare(strArr1[i], strArr2[i]) != 0) 
    { 
     Console.BackgroundColor = ConsoleColor.Blue; 
     Console.ForegroundColor = ConsoleColor.White; 
     Console.Write(strArr2[i]); 
     Console.ResetColor(); 
     Console.Write(" "); 
    } 
    else 
    { 
     Console.Write(strArr2[i] + " "); 
     Console.Write(" "); 
    } 
} 
0

Wahrscheinlich der einfachste Weg,

 String[] str1 = "foo foo ffo foo".Split(' '); 
     String[] str2 = "foo foo foo foo".Split(' '); 
     //if you want to push differences to a list just uncomment TODO lines 
     //List<String> result = new List<String>(); TODO 

     //int index = 0; TODO 
     for(int i = 0; i < str1.Length; i++) 
     { 
      if (str1[i] != str2[i]) 
      { 
       //str2[i] here is a different word 
       //result.Add(str2[i]); TODO 
       //index++; TODO 
      } 
     } 
Verwandte Themen