Да, можно использовать 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
между каждым
«Это не« ... что-то делать? –
выполнить ту же процедуру с помощью построителя строк, чтобы избежать копирования n раз –