分隔x个字符和空格后的字符串

本文关键字:字符串 空格 字符 分隔 | 更新日期: 2023-09-27 18:18:28

在这里有一点大脑融化,可以做一些帮助在逻辑上解决这个问题。

我基本上是要创建图像,只是基于用户输入的文本。

图像宽度是固定的,所以我需要解析文本,所以它都适合图像,但我需要确保我只在空白上分割,而不是分割单词。

这样的

after X amount of characters split string on last whitespace.
then after the next X amount of characters repeat.

我能想到的唯一方法是通过循环文本找到X个字符之前的最后一个空白(如果X不是空白),分割字符串。然后重复。

谁能想到一个更优雅的解决方案,或者这可能是最好的方法?

分隔x个字符和空格后的字符串

循环当然是可行的。你描述的算法应该没问题。使用迭代器块可以非常优雅地实现这一点。在这里阅读更多关于迭代器块和yield return构造的信息。您还可以将该方法变成一个扩展方法,使其看起来像这样:

public static IEnumerable<string> NewSplit(this string @this, int lineLength) {
    var currentString = string.Empty;
    var currentWord = string.Empty;
    foreach(var c in @this)
    {
        if (char.IsWhiteSpace(c))
        {
            if(currentString.Length + currentWord.Length > lineLength)
            {
                yield return currentString;
                currentString = string.Empty;
            }
            currentString += c + currentWord;
            currentWord = string.Empty;
            continue;
        }
        currentWord += c;
    };
    // The loop might have exited without flushing the last string and word
    yield return currentString; 
    yield return currentWord;
}

然后,它可以像普通的Split方法一样被调用:

myString.NewSplit(10);

迭代器块的好处之一是,它们允许您在返回元素之后执行逻辑(yield return语句之后的逻辑)。这允许程序员按照他或她考虑问题的方式来编写逻辑。

可以尝试这样的东西,它适用于单个分割

public static string SplitByCountAndWhiteSpace(this string str, int length)
{
    var words = str.Split(' ');
    var strBuilder = new StringBuilder();
    foreach (var word in words)
    {
        strBuilder.Append($"{word} ");
        if (strBuilder.Length >= length)
            break;
    }
    return strBuilder.ToString().TrimEnd();
}