LINQ - 拆分最大长度的字符串,但不要分开单词

Cie*_*iel 8 c# linq

我有一个简单的LINQ扩展方法...

    public static IEnumerable<string> SplitOnLength(this string input, int length)
    {
        int index = 0;
        while (index < input.Length)
        {
            if (index + length < input.Length)
                yield return input.Substring(index, length);
            else
                yield return input.Substring(index);

            index += length;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这需要一个字符串,并将其切换为不超过给定长度的字符串集合.

这很好 - 但我想进一步.它将文字分成两半.我不需要它来理解任何复杂的东西,我只是希望它能够在早期切断一个字符串,如果切割它将在length文本中间切割(基本上任何不是空白的东西).

但是我很害怕LINQ,所以我想知道是否有人知道如何解决这个问题.我知道我要做什么,但我不知道如何处理它.

所以我要说我有以下文字.

这是我将通过字符串拆分器传递的示例文本块.

我称这种方法SplitOnLength(6) 我会得到以下内容.

  • 这个我
  • sa sa
  • mple b
  • 锁定o
  • f文字
  • 通过
  • hrough
  • s
  • 特林
  • splitt
  • 呃.

我宁愿它足够智能停下来看起来更像..

  • 这个
  • 是一个
  • 样品

//糟糕的例子,因为单个单词超过了最大长度,但在实际场景中长度会更大,接近200.

谁能帮我?

Sae*_*iri 2

我将通过 for 循环解决这个问题:

var ret1 = str.Split(' ');
var ret2 = new List<string>();
ret2.Add("");
int index = 0;
foreach (var item in ret1)
{
    if (item.Length + 1 + ret2[index].Length <= allowedLength)
    {
        ret2[index] += ' ' + item;
        if (ret2[index].Length >= allowedLength)
        {
            ret2.Add("");
            index++;
        }
    }
    else
    {
        ret2.Add(item);
        index++;
    }
}
return ret2;
Run Code Online (Sandbox Code Playgroud)

首先我想到了 Zip,但在这里不太好。

和不同的执行版本与产量:

public static IEnumerable<string> SaeedsApproach(this string str, int allowedLength)
{
    var ret1 = str.Split(' ');
    string current = "";
    foreach (var item in ret1)
    {
        if (item.Length + 1 + current.Length <= allowedLength)
        {
            current += ' ' + item;
            if (current.Length >= allowedLength)
            {
                yield return current;
                current = "";
            }
        }
        else
        {
            yield return current;
            current = "";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)