Hemant Kothiyal
Hemant Kothiyal

Reputation: 4152

How to filter files from directory using LINQ?

In my program c#, i am using LINQ to fetch all file from directory for processing as following

var FilesToProcess = from filePath in Directory.GetFiles(sDirectory)
                        where File.GetCreationTime(filePath).BusinessDaysUntil(DateTime.Today)
                        select filePath;
if (FilesToProcess.Any())
{
    List<string> process = (from string s in FilesToProcess
                            where ((s.EndsWith(".ext")) || (s.EndsWith(".xml")))
                            select s).ToList();
}

But In my case i have xml and txt files of same name like A.xml and A.txt similarly B.xml and B.txt and same for others.

I want to use LINQ to fetch both files of same name for processing as following

Processfile(string xmlfile, string txtfile)

As per my above code, i am getting all files(xml, txt) from directory, but i don't know to proceed further.

Please help to filter the files of same name but different extention?

Upvotes: 2

Views: 13806

Answers (1)

Rich O&#39;Kelly
Rich O&#39;Kelly

Reputation: 41767

You can use the Linq GroupBy method to do this, eg:

DirectoryInfo directory = new DirectoryInfo(sDirectory);
var filePairs = directory
            .GetFiles("*.xml")
            .Union(directory.GetFiles("*.txt"))
            .GroupBy(file => file.Name);

Or if you wish to get just the files in pairs:

var filePairs = directory
            .GetFiles("*.xml")
            .Union(directory.GetFiles("*.txt"))
            .GroupBy(file => file.Name)
            .Select(grp => new
            {
                 XmlFile = grp.FirstOrDefault(file => file.Extension == "xml"),
                 TxtFile = grp.FirstOrDefault(file => file.Extension == "txt")
            })
            .Where(pair => pair.XmlFile != null && pair.TxtFile!= null);

Upvotes: 12

Related Questions