Если вы хотите использовать что-то наподобие StringBuilder, потому что его удобнее передавать и работать, тогда вы можете использовать что-то вроде следующего альтернативного StringBuilder, который я создал.
Самое важное, что он делает по-другому, это то, что он позволяет получить доступ к внутренним данным без предварительной сборки их в String или ByteArray. Это означает, что вам не нужно удваивать требования к памяти и рисковать, пытаясь выделить непрерывный кусок памяти, который соответствует всему вашему объекту.
ПРИМЕЧАНИЕ: я уверен, что есть лучшие варианты, чем внутреннее использование List<string>()
, но это было просто и оказалось достаточно для моих целей.
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);
}
}
Теперь вы можете выгрузить все содержимое в файл, используя следующий код.
var stringData = new StringBuilderEx();
stringData.Append("Add lots of data");
using (StreamWriter file = new System.IO.StreamWriter(localFilename))
{
stringData.ForEach((data) =>
{
file.Write(data);
});
}