【问题标题】:Most efficient way to retrieve one file path from a list of folders从文件夹列表中检索一个文件路径的最有效方法
【发布时间】:2014-12-31 06:21:40
【问题描述】:

假设我有一个包含 100 多个文件夹路径的列表。我想从每个文件夹路径中只检索一个文件路径。这是我正在做或计划做的方式:

var Files = new List<String>();
var Directories = Directory.GetDirectories("C:\\Firstfolder\\Secondfolder\\");
Array.ForEach(Directories, D => Files.Add(Directory.GetFiles(D).FirstOrDefault()));

现在,这是最有效的方法吗?因为我的程序每次启动都会执行这段代码。

【问题讨论】:

  • 仅供参考,有点 OT:使用 @"C:\Firstfolder\Secondfolder\" 来避免双重且难以阅读的反斜杠。如果您正在进行路径操作,请使用 [stackoverflow.com/questions/961704/….

标签: c# linq


【解决方案1】:

如果您使用的是 .Net 4.0,则应该这样做...

var Files = Directories.SelectMany(x => Directory.EnumerateFiles(x).FirstOrDefault()).ToList();

【讨论】:

  • 不错...简短而高效。我希望:)
  • 糟糕...我想我应该在排除之前测试代码。但没什么大不了的,我喜欢这个想法....我必须按如下方式更改代码才能工作。 var Files = String.Join("", Directories.SelectMany(x => Directory.EnumerateFiles(x).FirstOrDefault())).Split(new String[] {"C:\\"} , StringSplitOptions.RemoveEmptyEntries);
【解决方案2】:

而不是Directory.GetFiles 使用Directory.EnumerateFiles 来避免将所有文件路径加载到内存中。documentation 中的这句话解释了区别:

EnumerateFilesGetFiles 方法的区别如下: 使用 EnumerateFiles 时,可以在返回整个集合之前开始枚举名称集合;当您使用GetFiles 时,您必须等待返回整个名称数组才能访问该数组。因此,当您处理许多文件和目录时,EnumerateFiles 会更高效。

【讨论】:

  • 您可以注意到,GetFiles 返回数组,这是急切的。 EnumerateFiles 返回 IEnumerable 这是惰性的(可能)
猜你喜欢
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 2014-12-11
  • 2021-11-17
  • 1970-01-01
  • 2012-05-22
  • 2019-12-14
  • 1970-01-01
相关资源
最近更新 更多