編集: @ramon-smits が指摘しているように、 にアクセスできる場合はStringBuilder.GetChunks()
、 にもアクセスできますStreamWriter.WriteAsync(StringBuilder)
。したがって、代わりにこれを行うことができます:
StringBuilder stringBuilder = new StringBuilder();
// Write data to StringBuilder...
Stream stream = GetStream(); // Get output stream from somewhere.
using (var streamWriter = new StreamWriter(stream, Encoding.UTF8, leaveOpen: true))
{
await streamWriter.WriteAsync(stringBuilder);
}
はるかに簡単です。
私は最近、まさにこのことをしなければならず、この質問の答えが不十分であることがわかりました。
文字列全体を具体化せずに StringBuilder を Stream に書き込むことができます。
StringBuilder stringBuilder = new StringBuilder();
// Write data to StringBuilder...
Stream stream = GetStream(); // Get output stream from somewhere.
using (var streamWriter = new StreamWriter(stream, Encoding.UTF8, leaveOpen: true))
{
foreach (ReadOnlyMemory<char> chunk in stringBuilder.GetChunks())
{
await streamWriter.WriteAsync(chunk);
}
}
注意: この API (StringBuilder.GetChunks()) は、.NET Core 3.0 以降でのみ使用できます。
この操作が頻繁に発生する場合は、StringBuilder オブジェクト プールを使用して GC の負荷をさらに軽減できます。