Si desea utilizar algo así como un StringBuilder porque es más limpio para pasar alrededor y trabajar con él, entonces se puede usar algo como el siguiente alternativo StringBuilder creé.
Lo más importante que hace diferente es que permite el acceso a los datos internos sin tener que ensamblar primero en un String o ByteArray. Esto significa que no tiene que doblar los requisitos de memoria y correr el riesgo de tratar de asignar un trozo contiguo de memoria que se ajuste a su objeto completo.
NOTA: estoy seguro de que hay mejores opciones que usar un List<string>()
internamente, pero esto fue simple y resultó ser lo suficientemente bueno para mis propósitos.
public class StringBuilderEx
{
List<string> data = new List<string>();
public void Append(string input)
{
data.Add(input);
}
public void AppendLine(string input)
{
data.Add(input + "\n");
}
public void AppendLine()
{
data.Add("\n");
}
/// <summary>
/// Copies all data to a String.
/// Warning: Will fail with an OutOfMemoryException if the data is too
/// large to fit into a single contiguous string.
/// </summary>
public override string ToString()
{
return String.Join("", data);
}
/// <summary>
/// Process Each section of the data in place. This avoids the
/// memory pressure of exporting everything to another contiguous
/// block of memory before processing.
/// </summary>
public void ForEach(Action<string> processData)
{
foreach (string item in data)
processData(item);
}
}
Ahora puede volcar todo el contenido en el archivo utilizando el siguiente código.
var stringData = new StringBuilderEx();
stringData.Append("Add lots of data");
using (StreamWriter file = new System.IO.StreamWriter(localFilename))
{
stringData.ForEach((data) =>
{
file.Write(data);
});
}
No es posible si necesita usar la cadena para otra cosa antes de escribirla. – Skurmedel
Absolutamente cierto, pero por supuesto no ha dicho que sea un requisito, así que no hice ninguna suposición. –