使用 LINQ 进行高级文件读取
假设我们有两个文本文件,其中每一行代表一个要处理的单独元素。我们的目标是探索使用 C# 逐行读取这些文件的高效且可读的方法。
当前方法
目前,我们使用 StreamReader 单独读取每一行。虽然此方法很简单,但对于较大的文件或需要选择特定行时,它可能会变得低效。
利用 LINQ
LINQ 提供了一种强大的方法来解决此问题问题:
static IEnumerable<SomeType> ReadFrom(string file) { string line; using(var reader = File.OpenText(file)) { while((line = reader.ReadLine()) != null) { SomeType newRecord = /* parse line */ yield return newRecord; } } }
此方法使用迭代器块来实现惰性行读取器。通过使用yield关键字,它一次返回一条记录,而无需缓冲整个文件。
增强灵活性
为了解决内存消耗问题,我们可以修改代码略:
static IEnumerable<string> ReadFrom(string file) { string line; using(var reader = File.OpenText(file)) { while((line = reader.ReadLine()) != null) { yield return line; } } }
现在,这个方法返回一个没有缓冲的字符串序列。然后,我们可以使用像Where和Select这样的LINQ运算符来根据需要过滤和处理行。
... var typedSequence = from line in ReadFrom(path) let record = ParseLine(line) where record.Active // for example select record.Key;
此代码使用ReadFrom方法创建一个延迟计算的序列,使我们能够执行复杂的操作,而无需持有整个文件都在内存中。
结论
通过利用 LINQ,我们可以显着改进我们的文件读取代码的效率和可读性。惰性求值方法避免了不必要的内存消耗,使其成为处理大文件或选择特定行的理想选择。
以上是C# 读取大型文本文件时,LINQ 如何提高效率和可读性?的详细内容。更多信息请关注PHP中文网其他相关文章!