问题描述
我有这些字符串列表
List<string> files = new List<string>
(System.Linq.Enumerable.Concat
(System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),"*.*"),System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),"*.pdf")));
我想重构代码,并且想使用比concat更高效或更快速的方法。我该怎么做? 谢谢
解决方法
要获取所有文件的List<string>
,您可以编写:
using System.IO;
using System.Linq;
string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var files = Directory.GetFiles(path,"*.*").ToList();
这将包括所有PDF。
如果出于特殊目的不需要List<>
,则可以直接操纵GetFiles的结果字符串数组:
string[] files = Directory.GetFiles(path,"*.*");
或者简单地:
var files = Directory.GetFiles(path,"*.*");
这将避免转换为通用字符串列表所需的内存和时间。
您可以访问项并使用数组或列表循环访问每个项,因为它们实现IEnumerable并具有索引器。
仅当您需要轻松操纵诸如添加和删除之类的项目,或者出于任何原因想要OOP对象时,列表才有用。
也如@mjwills所建议的那样,您可以使用EnumerateFiles
而不是GetFiles
:第一次分析列表时,您无需等待完整的列表,并且最终不会如果有很多文件,则会出现延迟:
var files = Directory.EnumerateFiles(path,"*.*");
foreach (var filePath in files) ...
但是,每次执行解析时,它将重新扫描系统文件,这仅在进行一次解析或需要实时解析时才有用。