将文本拆分为具有最大长度的行

Joh*_*ies 7 c# string algorithm text

我有一个很长的字符串,我想把它放在一个小字段中.为了实现这一点,我将字符串分解为空格上的行.算法如下:

    public static string BreakLine(string text, int maxCharsInLine)
    {
        int charsInLine = 0;
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < text.Length; i++)
        {
            char c = text[i];
            builder.Append(c);
            charsInLine++;

            if (charsInLine >= maxCharsInLine && char.IsWhiteSpace(c))
            {
                builder.AppendLine();
                charsInLine = 0;
            }
        }
        return builder.ToString();
    }
Run Code Online (Sandbox Code Playgroud)

但是,如果有一个简短的单词,则会中断,然后是更长的单词.最大长度为16的"foo howcomputerwork"不会破坏,但我想要它.我有一个想法是期待看到下一个空白发生的地方,但我不确定这是否会导致最少的线路成为可能.

Dea*_*bit 6

请享用!

public static string SplitToLines(string text, char[] splitOnCharacters, int maxStringLength)
{
    var sb = new StringBuilder();
    var index = 0;

    while (text.Length > index)
    {
        // start a new line, unless we've just started
        if (index != 0)
            sb.AppendLine();

        // get the next substring, else the rest of the string if remainder is shorter than `maxStringLength`
        var splitAt = index + maxStringLength <= text.Length
            ? text.Substring(index, maxStringLength).LastIndexOfAny(splitOnCharacters)
            : text.Length - index;

        // if can't find split location, take `maxStringLength` characters
        splitAt = (splitAt == -1) ? maxStringLength : splitAt;

        // add result to collection & increment index
        sb.Append(text.Substring(index, splitAt).Trim());
        index += splitAt;
    }

    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

请注意,splitOnCharacters并且maxStringLength可以保存在应用程序的用户设置区域中.


Moo*_*oop 1

在写入字符串生成器之前检查字符的内容及其or当前计数:

    public static string BreakLine(string text, int maxCharsInLine)
    {
        int charsInLine = 0;
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < text.Length; i++)
        {
            char c = text[i];
            if (char.IsWhiteSpace(c) || charsInLine >= maxCharsInLine)
            {
                builder.AppendLine();
                charsInLine = 0;
            }
            else 
            {
                builder.Append(c);
                charsInLine++;                    
            }
        }
        return builder.ToString();
    }
Run Code Online (Sandbox Code Playgroud)