在C#的字符串列表中使用什么代替Concat

问题描述

我有这些字符串列表

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) ...

但是,每次执行解析时,它将重新扫描系统文件,这仅在进行一次解析或需要实时解析时才有用。