У большинства ответов может быть тот же недостаток.
При пустом тексте они ничего не дадут.
Мы (I) ожидаем, что, по крайней мере, вернем эту пустую строку (такое же поведение, что и при разбиении на символ, не входящий в строку, который вернет один элемент: данную строку)
, поэтому мы должны выполнить цикл хотя бы один раз (на основе кода Джона):
IEnumerable<string> SplitIntoChunks (string text, int chunkSize)
{
int offset = 0;
do
{
int size = Math.Min (chunkSize, text.Length - offset);
yield return text.Substring (offset, size);
offset += size;
} while (offset < text.Length);
}
или использование for ( Отредактировано : после того, как я немного поигрался с этим, я нашел лучший способ обработать регистр chunkSize больше, чем текст ):
IEnumerable<string> SplitIntoChunks (string text, int chunkSize)
{
if (text.Length <= chunkSize)
yield return text;
else
{
var chunkCount = text.Length / chunkSize;
var remainingSize = text.Length % chunkSize;
for (var offset = 0; offset < chunkCount; ++offset)
yield return text.Substring (offset * chunkSize, chunkSize);
// yield remaining text if any
if (remainingSize != 0)
yield return text.Substring (chunkCount * chunkSize, remainingSize);
}
}
Это также можно использовать с циклом do / while;)