2012-05-10 44 views
8

我需要在特定区域内写入不同段落的文字。举例来说,我画一个框,看起来像这样的控制台:当文本超过一定长度时,将文本换行到下一行?

/----------------------\ 
|      | 
|      | 
|      | 
|      | 
\----------------------/ 

我怎么会写在它的文字,但如果它变得太长时间换到下一行?

+3

你试过了什么?什么地方出了错? –

+0

我认为你不想分开话语? –

+0

@ L.B我试着读取字符串的长度,并且如果它超出了框的宽度,就会将其分开,但这需要我分割单词。它似乎并不能很好地工作。 –

回答

10

在行长之前的最后一个空格处分割?

int myLimit = 10; 
string sentence = "this is a long sentence that needs splitting to fit"; 
string[] words = sentence.Split(new char[] { ' ' }); 
IList<string> sentenceParts = new List<string>(); 
sentenceParts.Add(string.Empty); 

int partCounter = 0; 

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

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

foreach (string x in sentenceParts) 
    Console.WriteLine(x); 

UPDATE(上述方案中失去了最后一个字在某些情况下):

int myLimit = 10; 
string sentence = "this is a long sentence that needs splitting to fit"; 
string[] words = sentence.Split(' '); 

StringBuilder newSentence = new StringBuilder(); 


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

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

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

Console.WriteLine(newSentence.ToString()); 
+0

这有可能将词语分成两半,这是我不想要的。 –

+0

一些很好的例子[这里](http://stackoverflow.com/questions/4398270/how-to-split-string-preserving-whole-words) –

+1

它不应该把单词分成两半,因为它只添加完整的单词,直到长度限制已达到。但是,最好使用StringBuilder对象来构建最后一行,并使用像这样的String.Format方法:'String.Format(“{0}”,word);'。使用枚举数的列表,而不是索引获取元素也将是很好:)。这些升级可以使代码更高效,但是,它应该也是如此。 –

2

我修改吉姆·H的版本,使得它支持一些特殊情况。 例如句子不包含任何空格字符的情况;我还注意到,当一条线在最后一个位置有一个空间时会出现问题;那么最后会添加这个空间,最终会导致一个字符太多。

这里是我的版本,以防万一有人有兴趣:

public static List<string> WordWrap(string input, int maxCharacters) 
{ 
    List<string> lines = new List<string>(); 

    if (!input.Contains(" ")) 
    { 
     int start = 0; 
     while (start < input.Length) 
     { 
      lines.Add(input.Substring(start, Math.Min(maxCharacters, input.Length - start))); 
      start += maxCharacters; 
     } 
    } 
    else 
    { 
     string[] words = input.Split(' '); 

     string line = ""; 
     foreach (string word in words) 
     { 
      if ((line + word).Length > maxCharacters) 
      { 
       lines.Add(line.Trim()); 
       line = ""; 
      } 

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

     if (line.Length > 0) 
     { 
      lines.Add(line.Trim()); 
     } 
    } 

    return lines; 
} 
2

我修改曼弗雷德的版本。如果你把一个带有'\ n'字符的字符串放在它里面,它会奇怪地包装文本,因为它会把它算作另一个字符。有了这个小小的改变,一切都会顺利进行

public static List<string> WordWrap(string input, int maxCharacters) 
    { 
     List<string> lines = new List<string>(); 

     if (!input.Contains(" ") && !input.Contains("\n")) 
     { 
      int start = 0; 
      while (start < input.Length) 
      { 
       lines.Add(input.Substring(start, Math.Min(maxCharacters, input.Length - start))); 
       start += maxCharacters; 
      } 
     } 
     else 
     { 
      string[] paragraphs = input.Split('\n'); 

      foreach (string paragraph in paragraphs) 
      { 
       string[] words = paragraph.Split(' '); 

       string line = ""; 
       foreach (string word in words) 
       { 
        if ((line + word).Length > maxCharacters) 
        { 
         lines.Add(line.Trim()); 
         line = ""; 
        } 

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

       if (line.Length > 0) 
       { 
        lines.Add(line.Trim()); 
       } 
      } 
     } 
     return lines; 
    } 
1

我从Jim H.'s solution开始,并以此方法结束。唯一的问题是如果文本有任何超过限制的单词。但运作良好。

public static List<string> GetWordGroups(string text, int limit) 
{ 
    var words = text.Split(new string[] { " ", "\r\n", "\n" }, StringSplitOptions.None); 

    List<string> wordList = new List<string>(); 

    string line = ""; 
    foreach (string word in words) 
    { 
     if (!string.IsNullOrWhiteSpace(word)) 
     { 
      var newLine = string.Join(" ", line, word).Trim(); 
      if (newLine.Length >= limit) 
      { 
       wordList.Add(line); 
       line = word; 
      } 
      else 
      { 
       line = newLine; 
      } 
     } 
    } 

    if (line.Length > 0) 
     wordList.Add(line); 

    return wordList; 
} 
相关问题