Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

List<string>.contains with wildcards c#

Tags:

c#

asp.net

I'm trying to match a file name to a partial string in a List. The list will have something like 192 in it and the matching file will be xxx192.dat. Using .Contains does not match the file name to the string in the List. Can anyone tell me how to get this done or how to use wildcard chars in the contains? Code below.

    // use this to get a specific list of files
    private List<string> getFiles(string path, List<string> filenames)
    {
        List<string> temp = new List<string>();
        string mapPath = Server.MapPath(path);
        //DirectoryInfo Di = new DirectoryInfo(mapPath);
        DirectoryInfo Di = new DirectoryInfo(@"C:\inetpub\wwwroot\Distribution\" + path); // for testing locally
        FileInfo[] Fi = Di.GetFiles();

        foreach (FileInfo f in Fi)
        {
            if (filenames.Contains(f.Name)) **// *** this never matches**
             temp.Add(f.FullName);
        }
        return temp;
    }

I'v changed the code trying to use the suggestions but it's still not working. I'll add in the data like I'm stepping through the code.

    // use this to get a specific list of files
    private List<string> getFiles(string path, List<string> filenames)
    {
        List<string> temp = new List<string>();
        string mapPath = Server.MapPath(path);
        //DirectoryInfo Di = new DirectoryInfo(mapPath);
        DirectoryInfo Di = new DirectoryInfo(@"C:\inetpub\wwwroot\Distribution\" + path); // for testing locally

        foreach (string s in filenames) // list has 228,91,151,184 in it
        {
            FileInfo[] Fi = Di.GetFiles(s); // s = 228: Fi = {System.IO.FileInfo[0]}
            foreach (FileInfo f in Fi) //Fi = {System.IO.FileInfo[0]}
            {
                temp.Add(f.FullName);
            }
        }

        return temp;
    }

When I look at the directory where these files are I can see:

pbset228.dat

pbmrc228.dat

pbput228.dat

pbext228.dat

pbget228.dat

pbmsg228.dat

This is working now. It may not be the most efficient way to do this, but it gets the job done. Maybe someone can post a sample that does the same thing in a better way.

    // use this to get a specific list of files
    private List<string> getFiles(string path, List<string> filenames)
    {
        List<string> temp = new List<string>();
        string mapPath = Server.MapPath(path);
        //DirectoryInfo Di = new DirectoryInfo(mapPath);
        DirectoryInfo Di = new DirectoryInfo(@"C:\inetpub\wwwroot\Distribution\" + path); // for testing locally
        FileInfo[] Fi = Di.GetFiles();

        foreach (FileInfo f in Fi)
        {
            foreach (string s in filenames)
            {
                if (f.Name.Contains(s))
                    temp.Add(f.FullName);
            }               
        }

        return temp;
    }
like image 699
Jim Bedson Avatar asked Mar 26 '14 18:03

Jim Bedson


2 Answers

You can use the Any() LINQ extension:

filenames.Any(s => s.EndsWith(f.Name));

This will return True if any element in the enumeration returns true for the given function.

For anything more complex, you could use a regular expression to match:

filenames.Any(s => Regex.IsMatch(s, "pattern"));
like image 188
Mike Christensen Avatar answered Sep 22 '22 02:09

Mike Christensen


Use the static Directory.GetFiles method that lets you include a wildcards and will be more efficient that retrieving all the files and then having to iterate through them.

Or you can even use DirectoryInfo.GetFiles and pass your search string to that.

like image 32
Matt Burland Avatar answered Sep 22 '22 02:09

Matt Burland