Nach mehreren falschen Lösungen zu sehen ForEach
auf einen unveränderlichen Typ wie string
, indem ich denke, ich meine eigenen Beitrag würde.
Dies wird tatsächlich die erwähnte Datei lesen und schreiben. Dennoch ist es nur für kleinere Dateien, da der gesamte Inhalt im Speicher ist *.
string filename = @"C:\testfile.txt";
string[] fileLines = File.ReadAllLines(filename);
fileLines = Array.ConvertAll(fileLines, l => l.Trim());
File.WriteAllLines(filename, fileLines);
In der realen Welt, dann würden Sie wahrscheinlich wollen zunächst in eine andere Datei schreiben und es auf die Originaldatei umbenennen, nachdem die Operation erfolgreich war. Sonst könnten Teile der Datei verloren gehen, wenn beim Schreiben etwas schief gegangen ist.
Ad Speichernutzung:
Eigentlich wird die Datei zweimal vorübergehend in Erinnerung sein. Sie könnten das lösen, indem Sie eine normale for
-Schleife anstelle von beliebigen Erweiterungsmethoden und Lambda-Ausdrücken verwenden. Ich werde diese Übung überspringen und direkt auf den ‚richtigen‘ Weg, dies für größere Dateien zu tun:
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
Implementierung „ForEachLine“:
Wenn Sie eine Hilfsmethode implementieren möchten, das tut, was Sie beschreiben Sie, Sie könnten die hässliche Umbenennungslogik darin verstecken.
Die Signatur der Methode wäre so etwas wie:
public void ForEachLine(Func<string, string> func)
und die Linie, die den Schreib tun würde nur sein:
writer.WriteLine(func(line));
+1 funktioniert tatsächlich, mit einem Bonus der Auflistung Nachteile –
Great Post - mit Lösung und Erklärung ... –