我需要在特定区域内写入不同段落的文字。举例来说,我画一个框,看起来像这样的控制台:当文本超过一定长度时,将文本换行到下一行?
/----------------------\
| |
| |
| |
| |
\----------------------/
我怎么会写在它的文字,但如果它变得太长时间换到下一行?
我需要在特定区域内写入不同段落的文字。举例来说,我画一个框,看起来像这样的控制台:当文本超过一定长度时,将文本换行到下一行?
/----------------------\
| |
| |
| |
| |
\----------------------/
我怎么会写在它的文字,但如果它变得太长时间换到下一行?
在行长之前的最后一个空格处分割?
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());
这有可能将词语分成两半,这是我不想要的。 –
一些很好的例子[这里](http://stackoverflow.com/questions/4398270/how-to-split-string-preserving-whole-words) –
它不应该把单词分成两半,因为它只添加完整的单词,直到长度限制已达到。但是,最好使用StringBuilder对象来构建最后一行,并使用像这样的String.Format方法:'String.Format(“{0}”,word);'。使用枚举数的列表,而不是索引获取元素也将是很好:)。这些升级可以使代码更高效,但是,它应该也是如此。 –
我修改吉姆·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;
}
我修改曼弗雷德的版本。如果你把一个带有'\ 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;
}
我从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;
}
你试过了什么?什么地方出了错? –
我认为你不想分开话语? –
@ L.B我试着读取字符串的长度,并且如果它超出了框的宽度,就会将其分开,但这需要我分割单词。它似乎并不能很好地工作。 –