2013-03-05 53 views
0

是否有一种更有效的方法来使用Directory.GetFiles和'StartsWith','Contains'和'EndsWith'而不是我现在正在做的事情?通过'StartsWith','Contains'和'EndsWith'来有效地使用'Directory.GetFiles'来过滤文件名

 _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(); 
     } 
+2

最慢的部分将始终是'Directory.GetFiles',这是_almost_不可避免的。搜索字符串是相对可以忽略的,那不是你想要改进的,是吗? – 2013-03-05 12:02:40

+1

GetFiles()的重载可以提供一个searchpattern,你试过了吗? – Jobo 2013-03-05 12:04:44

回答

2

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

0

我想以下重载将帮助您:

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 
0

如果你想补习一切都变成的LINQ的单行线,你可以这样做以下:

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

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

相关问题