是否有一个C#语言构造/框架对象将函数应用于文件的每一行?

My *_*Ego 2 c#

我正在寻找的东西是这样的:

var f = UsefulFileObject(@"c:\temp.log");
f.ForEachLine( (line) => line.Trim() );
Run Code Online (Sandbox Code Playgroud)

之后,我希望修剪文件中的每一行.

框架中是否已存在此类对象,还是应该开始创建自己的对象?

Tho*_*rin 9

看到使用几种错误的解决方案后,ForEach在一个不变的类型,例如string,我想我会后我自己.

这实际上是读写所提到的文件.尽管如此,它只适用于小文件,因为整个内容都在内存中*.

string filename = @"C:\testfile.txt";
string[] fileLines = File.ReadAllLines(filename);
fileLines = Array.ConvertAll(fileLines, l => l.Trim());
File.WriteAllLines(filename, fileLines);
Run Code Online (Sandbox Code Playgroud)

在现实世界中,您可能希望首先写入不同的文件,并在操作成功后将其重命名为原始文件.否则如果在写中途出错的话,部分文件可能会丢失.

广告内存使用情况:
实际上,文件会在内存中暂时两次.您可以通过使用常规for循环而不是任何花哨的扩展方法和lambda表达式来解决这个问题.我将跳过这个练习并直接采用"适当"的方式为更大的文件执行此操作:

using (StreamReader reader = new StreamReader(@"D:\infile.txt"))
using (StreamWriter writer = new StreamWriter(@"D:\outfile.txt"))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        writer.WriteLine(line.Trim());
    }
}

// Some File.Move(..) usage to rename the files
Run Code Online (Sandbox Code Playgroud)

实现"ForEachLine":
如果你想实现一个你所描述的帮助器方法,你可以在那里隐藏丑陋的重命名逻辑.

方法签名类似于:

public void ForEachLine(Func<string, string> func)
Run Code Online (Sandbox Code Playgroud)

而写作的那一行就是:

writer.WriteLine(func(line));
Run Code Online (Sandbox Code Playgroud)