Working with log files or large text datasets? You’ll often need to search for lines containing specific keywords like "ERROR" or "WARNING". Instead of repeating the same logic, a C# Extension Method to Filter Lines offers a clean, reusable solution.
This post walks you through a memory-efficient, scalable approach using this custom method—applicable to both individual files and entire directories.
Why Use an Extension Method?
An extension method in C# lets you “extend” an existing type (like FileInfo) with new functionality without modifying the original class. This improves readability and reuse.
Here’s a clean and efficient implementation with C# Extension Method to Filter Lines :
using System;
using System.Collections.Generic;
using System.IO;
public static class FileExtensions
{
public static IEnumerable ReadAndFilter(this FileInfo info, Predicate condition)
{
if (info == null || condition == null)
throw new ArgumentNullException();
using var reader = new StreamReader(info.FullName);
string? line;
while ((line = reader.ReadLine()) != null)
{
if (condition(line))
{
yield return line;
}
}
}
}
Highlights:
yield returnis used to stream results—great for large files.- Uses a
Predicate<string>so you can pass any custom condition. - Wrapped with basic null checking for safety.
Let’s say you want to find all lines containing the word "ERROR" in a specific file:
string FilePath = "C:\\logs\\app.log";
string SearchString = "ERROR";
var result = new FileInfo(FilePath).ReadAndFilter(s => s.Contains(SearchString));
foreach (var line in result)
{
Console.WriteLine(line);
}
You can extend this logic to scan all .txt files in a folder:
string path = "C:\\logs";
foreach (string file in Directory.GetFiles(path, "*.txt"))
{
var result = new FileInfo(file).ReadAndFilter(s => s.Contains(SearchString));
foreach (string line in result)
{
Console.WriteLine($"[{Path.GetFileName(file)}] {line}");
}
}
(Visited 260 times, 1 visits today)
