В сочетании ответов голубей + Konstatin ...
static IEnumerable<string> WholeChunks(string str, int chunkSize) {
for (int i = 0; i < str.Length; i += chunkSize)
yield return str.Substring(i, chunkSize);
}
Это будет работать для всех строк, которые могут быть разделены на целые числа кусков, и в противном случае генерирует исключение.
Если вы хотите поддерживать строки любой длины, вы можете использовать следующий код:
static IEnumerable<string> ChunksUpto(string str, int maxChunkSize) {
for (int i = 0; i < str.Length; i += maxChunkSize)
yield return str.Substring(i, Math.Min(maxChunkSize, str.Length-i));
}
Однако OP явно указал, что он not нуждается в этом ; это несколько длиннее и труднее читать, немного медленнее. В духе KISS и YAGNI я бы пошел с первым вариантом: возможно, это самая эффективная реализация, и она очень короткая, читаемая и, что важно, создает исключение для несоответствующего ввода.