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

时间:2013-03-08 12:45:15

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

但是当有一个简短的单词时,这就会中断,然后是一个更长的单词。最大长度为16的“foo howcomputerwork”不会破坏,但我想要它。我有一个想法是期待看到下一个空白出现的位置,但我不确定这是否会导致最少的行。

3 个答案:

答案 0 :(得分: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();
}

请注意,splitOnCharactersmaxStringLength可以保存在应用的用户设置区域中。

答案 1 :(得分: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();
    }

答案 2 :(得分:0)

稍微更新一下代码,@ dead.rabit会在某个时候循环。

 public static string SplitToLines(string text,char[] splitanyOf, int maxStringLength)
    {               
        var sb = new System.Text.StringBuilder();
        var index = 0;
        var loop = 0;
        while (text.Length > index)
        {
            // start a new line, unless we've just started
            if (loop != 0)
            {
                sb.AppendLine();
            }

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

            // if can't find split location, take `maxStringLength` characters
            if (splitAt == -1 || splitAt == 0)
            {
                splitAt = text.IndexOfAny(splitanyOf, maxStringLength);
            }

            // add result to collection & increment index
            sb.Append(text.Substring(index, splitAt).Trim());
            if(text.Length > splitAt)
            {
                text = text.Substring(splitAt + 1).Trim();
            }
            else
            {
                text = string.Empty;
            }
            loop = loop + 1;
        }

        return sb.ToString();
    }