2016-05-16 8 views
0

Я искал запись приложения консольного приложения на языке C#. Я нашел здесь много полезных примеров, но у меня проблемы с тем, что у меня есть.C# word wrap, как ограничить создание новой строки на основе разных слов в строке

Код, который у меня есть, создаст новую строку после каждого слова, которое «переполняет» columnLimit. Мне нужен/нужен способ добавления новой строки только в том случае, если это слово не является окончательным в строке и, если возможно, добавить дефис, когда слово переполняет между двумя строками (так что это будет слово сплиттер, а не word wrapper).

Я знаю, что это, вероятно, очень простое решение, но я новичок в C#, и я действительно застрял в этой проблеме. Решение для кодирования, чтобы я мог видеть, где я ошибся, было бы идеальным.

Может ли кто-нибудь помочь мне с этим?

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

ответ

1

Вы должны использовать длину на участке линии выходит за предел, чтобы сделать подстроки, что делает вашу петлю foreach больше похожей на это

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

} 

Если вы хотите включить тир, взять 1 от соответствующих подстрок и добавить щепотку как так

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

Это почти идеальное - при выполнении кода, однако он по-прежнему создает новую строку, даже после того, как последнее слово в строке .. любая идея о том, как это исправить? (его основная проблема, из-за которой мои тесты терпят неудачу) – Dusky

+0

Отредактировано для изменения этого, надеюсь, что это сработает для вас сейчас –

+0

При запуске теперь это приводит к тому, что в этой строке не было обработано исключение ArgumentOutOfRangeException (newLongSentence.AppendLine (строка + word.Substring (0, word.length + extraLetters - 1) + "-"), дополнительная информация говорит: длина не может быть меньше нуля. – Dusky

0

попробовать это

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

и если columnLimit имеет важное значение, то вам может помочь

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