列出<string> .contains with wildcards c#</string>

时间:2014-03-26 18:00:03

标签: c# asp.net

我试图将文件名匹配到List中的部分字符串。该列表中将包含192个匹配文件,匹配文件为xxx192.dat。使用.Contains将文件名与List中的字符串不匹配。谁能告诉我如何完成这项工作或如何在包含中使用通配符? 代码如下。

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

我改变了尝试使用建议的代码,但它仍然无效。我将添加数据,例如我踩过代码。

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

当我查看这些文件所在的目录时,我可以看到:

pbset228.dat

pbmrc228.dat

pbput228.dat

pbext228.dat

pbget228.dat

pbmsg228.dat

现在正在运作。它可能不是最有效的方法,但它完成了工作。也许有人可以发布一个更好地做同样事情的样本。

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

3 个答案:

答案 0 :(得分:7)

您可以使用Any() LINQ扩展名:

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

如果给定函数中枚举中的任何元素返回true,则返回True

对于任何更复杂的事情,您可以使用正则表达式来匹配:

filenames.Any(s => Regex.IsMatch(s, "pattern"));

答案 1 :(得分:6)

使用静态Directory.GetFiles方法,该方法允许您包含通配符,并且检索所有文件然后必须遍历它们会更有效。

或者你甚至可以使用DirectoryInfo.GetFiles并将搜索字符串传递给它。

答案 2 :(得分:0)

更改此

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

进入类似的事情

temp = filenames.Find(file => file.Contains(someNameYoureLookingFor));