是的,可以使用 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 并切换到 usingFile.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
之间都有一个