快速文本阅读器 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 倍于文件路径的数量。 是否可以使用字符串生成器来执行该操作?我试过了,但没有。提前谢谢。

快速文本阅读器 C#

下面是一个简短的 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));

这将完成上述所有操作,它将:

  1. 读入所有文件
  2. String.Join 将计算保存整个字符串所需的总大小
  3. 然后它将合并所有文本,每个文本之间都有一个'n