【问题标题】:Return a list of Directory (Folder) names that match a partial string返回与部分字符串匹配的目录(文件夹)名称列表
【发布时间】:2018-10-06 03:28:43
【问题描述】:

我需要有人指引我正确的方向。

目标:
在名称中包含字符串的路径中返回 文件夹名称 列表。例如:路径有一个名为 Pictures_New 和 Videos_New 的目录。我正在搜索的字符串是“Pictures_”和“Videos_”。

这一切都适用于一个作为搜索字符串传递的字符串参数。我的问题是让它与多个过滤器一起工作。我知道使用文件名和扩展名很容易完成。

这正在传递给GetFolders()

string[] filterStrings = { "Pictures_", "Videos_" }

我的其余代码:

public IEnumerable<string> GetFolders(string path, string[] filterStrings, SearchOption searchOption = SearchOption.AllDirectories)
{
    IEnumerable<string> folders = Directory.EnumerateDirectories(path, "Pictures_*.*", searchOption);
    var resultFolders = new List<string>();

    if(filterStrings.Length > 0)
    {
        foreach (var foldername in folders)
        {
            string folderName = Path.GetFileName(Path.GetDirectoryName(foldername));

            if (string.IsNullOrEmpty(folderName) || Array.IndexOf(filterStrings, "*" + folderName) < 0)
            {
                // This leaves us only with the Directory names. No paths.
                var b = (foldername.Substring(foldername.LastIndexOf(@"\") + 1));
                resultFolders.Add(b);
            }
        }
    }
    return resultFolders;
}

【问题讨论】:

  • 我不确定"Pictures_*.*" 是否会匹配任何目录,它看起来更像是一个文件过滤器...
  • 但确实如此,除非我完全没有抓住重点。这些目录中当前没有文件。我得到了所有带有 Pictures_ 的目录返回的名称。
  • 为什么不使用 filterStrings.Contains(folderName) ?

标签: c# winforms linq directory


【解决方案1】:

您可以使用 Linq SelectMany 解析您的过滤器列表并返回带有 Directory.GetDirectories(); 的结果列表
它当然会返回与过滤器匹配的所有子目录。只使用“*”。

public IEnumerable<string> GetFolders(string path, string[] filterStrings, SearchOption searchOption = SearchOption.AllDirectories)
{
    List<string> resultFolders = filterStrings
                 .SelectMany(flt => Directory.GetDirectories(path, flt, searchOption))
                 .ToList();
    return resultFolders;
}

【讨论】:

    【解决方案2】:

    尝试:

    var patterns = new[] { "Pictures_*", "Videos_*" };
    var dirsFound = new List<string>();
    foreach (var dir in patterns.Select(pattern => Directory.GetDirectories(@"my path", pattern).ToArray()))
    {
        dirsFound.AddRange(dir);
    }
    

    【讨论】:

    • 稍微优化的版本是使用SelectMany 而不是SelectAddRangevar dirsFound = patterns.SelectMany(pattern =&gt; Directory.GetDirectories(@"my path", pattern).ToArray()).
    【解决方案3】:

    看起来您没有循环遍历每个过滤器字符串:

    var folders = new List<string>();
    foreach (var filterString in filterStrings)
    {
        folders.AddRange(Directory.EnumerateDirectories(path, filterString, searchOption););
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      相关资源
      最近更新 更多