はい、StringBuilderを使用することは可能です。このコードを「最適化」するには、さまざまな方法があります。
TL; DR:これを行うための最良の方法については、この投稿の最後の部分にスキップしてください。
コードのステージ1の変更は次のとおりです。
StringBuilder combinetexts = new StringBuilder();
foreach (string path in filePaths)
{
StreamReader fs = new StreamReader(path);
string file_text = fs.ReadToEnd();
combinetexts.Append(file_text).Append("\n");
fs.Close();
}
次に、ビルドする前に、StringBuilder
実際に必要なスペースの量を計算できます。これにより、文字列をさらにコピーする可能性が低くなります。
long totalSize = 0;
foreach (string path in filePaths)
totalSize += new FileInfo(path).Length + 1; // +1 = \n
StringBuilder sb = new StringBuilder(Convert.ToInt32(totalSize));
foreach (string path in filePaths)
{
StreamReader fs = new StreamReader(path);
string file_text = fs.ReadToEnd();
combinetexts.Append(file_text).Append("\n");
fs.Close();
}
最後にusing (...)
、呼び出しの代わりに使用しfs.Close();
ます:
long totalSize = 0;
foreach (string path in filePaths)
totalSize += new FileInfo(path).Length + 1; // +1 = \n
StringBuilder sb = new StringBuilder(Convert.ToInt32(totalSize));
foreach (string path in filePaths)
{
using (StreamReader fs = new StreamReader(path))
{
string file_text = fs.ReadToEnd();
combinetexts.Append(file_text).Append("\n");
}
}
次に、LINQをもう少し使用してFile.ReadAllText
、明示的なの代わりに使用に切り替えてからStreamReader
、コード行を少し組み合わせます。
long totalSize = filePaths.Sum(path => new FileInfo(path).Length + 1);
StringBuilder sb = new StringBuilder(Convert.ToInt32(totalSize));
foreach (string path in filePaths)
{
combinetexts.Append(File.ReadAllText(path)).Append("\n");
}
ただし、結局のところ、これを行うにはさらに良い方法があります。
string combinetexts = String.Join("\n", filePaths.Select(path => File.ReadAllText(path)));
またはC#4.0では、メソッドグループの変換を処理する正しい方法をより適切に推測できます。
string combinetexts = String.Join("\n", filePaths.Select(File.ReadAllText));
これにより、上記のすべてが実行されます。
- すべてのファイルを読み込む
- String.Joinは、文字列全体を保持するために必要な合計サイズを計算します
- 次に、すべてのテキストを結合します
\n
。