La mayoría de las respuestas pueden tener el mismo defecto. Dado un texto vacío, no cederán nada. Nosotros (I) esperamos al menos recuperar esa cadena vacía (el mismo comportamiento que una división en una cadena no en la cadena, que devolverá un elemento: esa cadena dada)
así que deberíamos repetir al menos una vez todo el tiempo (basado en el código de Jon):
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);
}
o utilizando una de (Editado: después de juguetear un poco más con esto me he encontrado una mejor manera de manejar el caso chunkSize mayor que el texto):
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);
}
}
que también podría ser utilizado con el do/while;)
¿Estás seguro de que necesita 512 ** char ** trozos? Porque eso es diferente de 512 ** bytes **, que es una restricción más común. –
@Henk: por otro lado, dividir * text * en fragmentos basados en * bytes * sería bastante extraño: los resultados dependerían de la codificación. –
Jon, sí, un problema común al volver a armar el texto. Pero algunos canales de E/S operan en bloques de 512 bytes. –