【问题标题】:Efficient use of 'Directory.GetFiles' with 'StartsWith', 'Contains' and 'EndsWith' to filter file names有效使用带有“StartsWith”、“Contains”和“EndsWith”的“Directory.GetFiles”来过滤文件名
【发布时间】:2013-03-05 12:01:15
【问题描述】:

有没有更有效的方法来使用 Directory.GetFiles 和 'StartsWith'、'Contains' 和 'EndsWith' 过滤文件名,而不是我目前的方式?

        _files = Directory.GetFiles(_path);

        if (!String.IsNullOrEmpty(_startsWith))
        {
            _files = _files.Where(x => x.StartsWith(_startsWith)).ToArray();
        }

        if (!String.IsNullOrEmpty(_contains))
        {
            _files = _files.Where(x => x.Contains(_contains)).ToArray();
        }

        if (!String.IsNullOrEmpty(_endsWith))
        {
            _files = _files.Where(x => x.EndsWith(_endsWith)).ToArray();
        }

【问题讨论】:

  • 最慢的部分总是Directory.GetFiles,这几乎是不可避免的。搜索字符串相对来说可以忽略不计,这不是你想要改进的,是吗?
  • GetFiles() 有一个重载,您可以在其中提供搜索模式,您尝试过吗?

标签: c# file filtering contains startswith


【解决方案1】:

你应该切换到Directory.EnumerateFiles(),因为它是懒惰的,不需要首先建立完整的列表。

【讨论】:

    【解决方案2】:

    我认为以下重载会对您有所帮助:

    Directory.GetFiles(strPath, "*" + strFilter, SearchOption.TopDirectoryOnly); // to get behaviour of EndsWith
    
    Directory.GetFiles(strPath, "*" + strFilter + "*", SearchOption.TopDirectoryOnly); // to get behaviour of Contains
    
    Directory.GetFiles(strPath, strFilter + "*", SearchOption.TopDirectoryOnly); // to get behaviour of StartsWith
    

    【讨论】:

      【解决方案3】:

      如果你想把所有东西都塞进一行 Linq,你可以做如下的事情:

      _files = _files.Where(_ => !String.IsNullOrEmpty(_startsWith)).Where(x => x.StartsWith(_startsWith)).ToArray();
      

      但是,如上所述,Directory.GetFiles 几乎可以肯定是此处代码中最慢的部分,您最好坚持使用更易于阅读的内容。

      【讨论】:

        猜你喜欢
        • 2021-01-07
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        相关资源
        最近更新 更多