快速文本阅读器 C#
本文关键字:文本 | 更新日期: 2023-09-27 18:33:41
我使用以下代码在一个字符串中读取和组合文本数量:
foreach (string path in filePaths)
{
StreamReader singfile = new StreamReader(path);
string file_text = singfile.ReadToEnd();
combinetexts += file_text + "'n";
fs.Close();
}
据我所知,字符串组合文本将复制 n 倍于文件路径的数量。 是否可以使用字符串生成器来执行该操作?我试过了,但没有。提前谢谢。
下面是一个简短的 LINQ 方法:
string result = string.Join("'n", filePaths.Select(x => File.ReadAllText(x)));
或者使用 C# 4(它更好地处理类型推断 wrt 方法组转换(:
string result = string.Join("'n", filePaths.Select(File.ReadAllText));
如果您使用的是 .NET 3.5,则需要创建一个字符串数组,因为当时string.Join
没有那么多重载:
string result = string.Join("'n", filePaths.Select(x => File.ReadAllText(x))
.ToArray());
诚然,这样做的缺点是在执行串联之前读取所有文件 - 但它仍然比原始代码中的重复连接要好。它也可能比使用StringBuilder
更有效 - 这取决于string.Join
实现。
请参阅我关于StringBuilder
的文章,了解为什么原始代码效率非常低下。
编辑:请注意,这不包括末尾的尾随'n
。如果你真的想添加它,你可以:)
使用StringBuilder而不是字符串的示例:
var sb = new StringBuilder();
foreach (string path in filePaths)
sb.AppendLine(File.ReadAllText(path));
string result = sb.ToString();
(我也冒昧地缩短/优化了你的代码。File.ReadAllText 无需手动打开 StreamReader 即可读取文件的完整内容。此外,AppendLine
会自动在末尾添加'n
。
可以,使用
StringBuilder combinetexts = new StringBuilder();
...
combinetexts.Append(file_text);
combinetexts.Append("'n");;
使用 StringBuilder 操作字符串更有效。
http://www.codeproject.com/Articles/14936/StringBuilder-vs-String-Fast-String-Operations-wit
此致敬意
尝试以下代码:
StringBuilder strBuilder= new StringBuilder();
foreach (string path in filePaths)
{
StreamReader singfile = new StreamReader(path);
string file_text = singfile.ReadToEnd();
strBuilder.AppendLine(file_text);
fs.Close();
}
Console.WriteLine(strBuilder.ToString());
是的,可以使用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