List<string>.contains with wildcards c#

asp.net, c#

Solution

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"));

Problem

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; } ```

Original source