2016-05-16 27 views
0

Ich habe in das Schreiben einer Word-Wrap-Konsolenanwendung in C# untersucht. Ich habe hier viele nützliche Beispiele gefunden, aber ich habe Probleme mit dem, was ich gerade habe.C# Zeilenumbruch, wie die Erstellung neuer Zeilen basierend auf verschiedenen Wörtern in einer Zeichenfolge zu begrenzen

Der Code, den ich habe, wird eine neue Zeile nach jedem Wort erstellen, das die columnLimit "überläuft". Ich möchte/brauche eine Möglichkeit, eine neue Zeile nur dann hinzuzufügen, wenn dieses Wort nicht das letzte in der Zeichenfolge ist, und wenn möglich, einen Bindestrich hinzuzufügen, wenn das Wort zwischen zwei Zeilen überläuft (so wird es ein Wortsplitter nicht sein Wortumhüllung).

Ich weiß, es ist wahrscheinlich eine wirklich einfache Lösung, aber ich bin neu in C# und ich bin wirklich auf dieses Problem fest. Eine Kodierungslösung, damit ich sehen kann, wo ich falsch gelaufen bin, wäre ideal.

Kann mir jemand dabei helfen?

public string formatText(string longSentence, int columnLimit) 
{ 
    string[] words = longSentence.Split(' '); 
    StringBuilder newLongSentence = new StringBuilder(); 
    string line = ""; 

    foreach (string word in words) 
    { 
     if ((line + word).Length > columnLimit) 
     { 
      newLongSentence.AppendLine(line); 
      line = ""; 
     } 

     line += string.Format("{0} ", word); 
    } 

    if (line.Length > 0) 
     newLongSentence.AppendLine(line); 

    return newLongSentence.ToString();  
} 

Antwort

1

Sie helfen verwenden eine Teil zu tun, machen Sie Ihre foreach Schleife sehen mehr wie diese

foreach (string word in words) 
{ 
    int extraLetters = columnLimit - (line + word).Length; 
    if (extraLetters < 0 && extraLetters != word.Length) 
    { 

     newLongSentence.AppendLine(line + word.Substring(0, word.length + extraLetters)); 
     line = string.Format("{0} ", word.Substring(word.length + extraLetters + 1)); 

    } 
    else if(extraLetters == word.Length) 
    { 
     newLongSentence.AppendLine(line); 
     line = String.Format("{0} ", word); 
    } 
    else 
    { 
     line += string.Format("{0} ", word); 
    } 

} 

Wenn Sie einen Bindestrich aufnehmen möchten, nehmen Sie 1 aus den entsprechenden Teil entfernt und einen Bindestrich hinzufügen wie so

foreach (string word in words) 
{ 
    int extraLetters = columnLimit - (line + word).Length; 
    if (extraLetters < 0 && extraLetters != word.Length && extraLetters != word.Length - 1) 
    { 

     newLongSentence.AppendLine(line + word.Substring(0, word.length + extraLetters - 1) + "-"); 
     line = string.Format("{0} ", word.Substring(word.length + extraLetters)); 

    } 
    else if(extraLetters == word.Length || extraLetters == word.Length - 1) 
    { 
     newLongSentence.AppendLine(line); 
     line = String.Format("{0} ", word); 
    } 
    else 
    { 
     line += string.Format("{0} ", word); 
    } 

} 
+0

Dies ist fast perfekt - auf den Code jedoch läuft es noch schafft eine neue Linie auch nach der Letztes Wort in der Zeichenfolge .. irgendeine Idee, wie das zu beheben? (es ist das Hauptproblem, das meine Tests zum Scheitern bringt) – Dusky

+0

Bearbeitet, um das zu ändern, hoffe, dass dies für Sie jetzt funktioniert –

+0

Wenn es jetzt ausgeführt wird bewirkt, dass eine ArgumentOutOfRangeException in dieser Zeile nicht behandelt wurde (newLongSentence.AppendLine (line + word.Substring (0, word.length + extraLetters - 1) + "-"), die zusätzliche Information sagt: Länge kann nicht kleiner als Null sein. – Dusky

0

versuchen diese

public string formatText(string textData) 
    { 
      textData = new Regex(@" {2,}").Replace(textData.Trim(), @" "); 
      var left = Console.CursorLeft; var top = Console.CursorTop; var lines = new List<string>(); 
      for (var i = 0; textData.Length > 0; i++) 
      { 
       lines.Add(textData.Substring(0, Math.Min(Console.WindowWidth, textData.Length))); 
       var length = lines[i].LastIndexOf(" ", StringComparison.Ordinal); 
       if (length > 0) lines[i] = lines[i].Remove(length); 
       textData = textData.Substring(Math.Min(lines[i].Length + 1, textData.Length)); 
       Console.SetCursorPosition(left, top + i); Console.WriteLine(lines[i]); 
      } 
    } 

und wenn columnLimit wichtig ist, dann sollte die Länge der die Linie geht über die Grenze folgenden können Sie

public string formatText(string longSentenceParts,int columnLimit) 
{ 
     string[] words = longSentence.Split(new char[] { ' ' }); 
     IList<string> longSentenceParts = new List<string>(); 
     longSentenceParts.Add(string.Empty); 

     int partCounter = 0; 

     foreach (string word in words) 
     { 
      if ((longSentenceParts[partCounter] + word).Length > columnLimit) 
      { 
       partCounter++; 
       longSentenceParts.Add(string.Empty); 
      } 

      longSentenceParts[partCounter] += word + " "; 
     } 

     foreach (string x in longSentenceParts) 
      Console.WriteLine(x); 
}