2016-04-01 5 views
1

Wie kann ich eine Zeichenfolge zwischen zwei Zeichenfolgen einfügen, wenn eine Bedingung zutrifft?Überprüfen Sie, ob die Wörter im Zeichenfolgenarray enden und mit char beginnen und eine neue Zeichenfolge dazwischen einfügen (C#)

Nehmen wir an, wir haben eine Reihe von Zeichen, die wir überprüfen möchten, ob das erste Wort mit einem von ihnen endet und das zweite Wort mit einem von ihnen beginnt.

Zum Beispiel "Go home" wird die Bedingung übergeben, da "o" und "h" sind Buchstaben, die Anforderung erfüllen wird (=> Go ___ zu Hause)

char[] toCheck = {'h','o','d', 'g'}; 
string sentence = "Go home"; 

List<string> words = sentence.Split(' ').ToList(); 

for (int i = 0; i < words.Count - 1; i++) 
    { 
     if (toCheck.Any(x=> x == words[i][words[i].Length - 1]) && 
      (toCheck.Any(x=> x == words[i + 1][0]))) 
     { 
      words.Insert(i,"_between"); 
     } 
    } 

return words.Aggregate("", (current, word) => current + (word + " ")); 

Mein Problem ist, dass diese zurückkehrt " _zwischen Go _between home "statt" Go _between home "und ich kann nicht herausfinden warum.

Vielen Dank für Ihre Hilfe.

+1

Sie könnten tun 'x == Worte [i] .Last()' statt 'x == Worte [i] [Worte [i] .Length - 1]' die IMO besser lesbar ist. Und benutze 'return string.Join (" ", words);' um die Wörter wieder zusammenzufügen. – juharr

+1

Fügen Sie in Ihrer 'if' Bedingung' i> 0 && 'hinzu. Dies sollte dich reparieren. Stellen Sie sicher, dass es die erste Bedingung in Ihrem 'if' ist. Oder, noch besser, ändern Sie Ihre 'for' -Schleife zu' for (int i = 1; i Icemanind

+1

Das Problem ist, dass die Länge von "Wörtern" weiter wächst, da Sie Werte hinzufügen. Es ist am besten, eine Sammlung nicht zu mutieren, die Sie aus diesem Grund durchlaufen. – juharr

Antwort

1

Hier ist eine Methode, die Sie, dies zu tun verwenden könnte, die eine Folge der Wörter anstelle des Einsetzens in die ursprüngliche Sammlung zurück.

private static IEnumerable<string> InsertBetween(
    this IList<string> words, 
    char[] characters, 
    string insertValue) 
{ 
    for (int i = 0; i < words.Count - 1; i++) 
    { 
     yield return words[i]; 
     if (characters.Contains(words[i].Last()) && characters.Contains(words[i + 1][0])) 
      yield return insertValue; 
    } 

    if (words.Count > 0) 
     yield return words[words.Count - 1]; 
} 

Dann ist dieses Lauf

char[] toCheck = { 'h', 'o', 'd', 'g' }; 
string sentence = "Go home"; 
Console.WriteLine(string.Join(" ", sentence.Split().InsertBetween(toCheck, "_between"))); 

Sie geben

Go _between Hause

Ich denke nur, es ist besser, ein colleciton zu vermeiden mutiert, die Sie über sind Looping , aber wenn Sie das tun, müssen Sie den Index erhöhen, wenn Sie eine Einfügung machen, also Sie Über den eingegebenen Wert hinausgehen und an der richtigen Stelle einfügen.

for (int i = 0; i < words.Count - 1; i++) 
{ 
    if (toCheck.Any(x => x == words[i][words[i].Length - 1]) && 
     (toCheck.Any(x => x == words[i + 1][0]))) 
    { 
     words.Insert(i + 1, "_between"); 
     i++; 
    } 
} 
+0

Vielen Dank! Am Ende ist diese Methode in meinem Fall am besten geeignet, daher akzeptiere ich sie als Antwort. – Razzor

1

Betrachten Sie es als eine sehr geradlinig Art und Weise tun, durch die sich ergebende Satz in einem neuen string gespeicherten:

char[] toCheck = { 'h', 'o', 'd', 'g' }; 
string sentence = "Go home"; 

string finalsentence = ""; 

List<string> words = sentence.Split(' ').ToList(); 
for (int i = 0; i < words.Count - 1; i++) { 
    if (toCheck.Any(x => x == words[i][words[i].Length - 1]) && 
     (toCheck.Any(x => x == words[i + 1][0]))) { 
      finalsentence = words[i] + "_between" + words[i + 1] + " "; 
    } 
} 

return finalsentence; 

aber sagen, dass, wenn Sie Ihre aktuelle Methode Worte machen, sollten Sie einfügen beziehen sich auf in Index i + k (mit inkrementierten k von 1 beginnend, bis juharr dank) statt i und mit string.Join, nicht aggregate:

char[] toCheck = { 'h', 'o', 'd', 'g' }; 
string sentence = "Go home"; 
int k = 1; 

List<string> words = sentenc;e.Split(' ').ToList(); 
for (int i = 0; i < words.Count - 1; i++) { 
    if (toCheck.Any(x => x == words[i][words[i].Length - 1]) && 
     toCheck.Any(x => x == words[i + 1][0])) { 
      words.Insert(i + k++, "_between"); 
    } 
} 

return string.Join(" ", words); 
+1

Oder besser noch ein 'StringBuilder'. – juharr

+0

@juharr oder 'string.Join' ...;) – Ian

+1

Wenn ein Wort eingefügt wird, muss' i' inkrementiert werden, oder wenn eines der Zeichen der letzte Buchstabe im eingefügten Wort ist, würde dies zu einer Endlosschleife führen. – juharr

0

"Mein Problem ist, dass das" _zwischen Go _between home "anstatt" Go _between home "zurückkehrt und ich nicht herausfinden kann, warum."

Da Ihre i-Index in words.Insert(i,"_between"); ist von 0 beginnend. Sie könnten den Code auf viele Arten ändern, aber basierend auf Ihrer Frage, wenn Sie es behalten möchten, nur nicht words.Insert(i,"_between"); für i == 0.

Hope this helps ...

Verwandte Themen