La maggior parte della risposta potrebbe avere lo stesso difetto. Dato un testo vuoto non daranno nulla. Noi (I) aspettiamo almeno di recuperare quella stringa vuota (lo stesso comportamento di una divisione su un char non nella stringa, che restituirà un elemento: quella stringa)
quindi dovremmo fare un ciclo almeno una volta tutti i tempi (in base al codice di 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 utilizzando un per (Edited: dopo aver giocato un po 'di più con questo, ho trovato un modo migliore per gestire il caso chunksize maggiore di testo):
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);
}
}
che potrebbe essere utilizzato anche con il fai/while;)
Sei sicuro bisogno di 512 ** char ** pezzi? Perché è diverso da 512 ** byte **, che è un vincolo più comune. –
@Henk: D'altra parte, suddividere * testo * in blocchi basati su * byte * sarebbe piuttosto strano - i risultati dipenderebbero dalla codifica. –
Jon, sì, un problema comune durante il riassemblaggio del testo. Ma alcuni canali I/O funzionano in blocchi da 512 byte. –