C# 递归地遍历子目录并将目录添加到列表中(如果它包含任何具有特定结尾的文件)

C# 递归地遍历子目录并将目录添加到列表中(如果它包含任何具有特定结尾的文件),c#,.net,linq,C#,.net,Linq,从父目录开始,我希望递归地遍历每个目录,并将目录名添加到列表中(如果它包含任何具有特定结尾的文件) 我的第一个方法是 var allTestDirectories = new List<DirectoryInfo>(); Directory.GetFiles(parentDirectory, "*spec.js", SearchOption.AllDirectories) .ForEach(specFile => allTestDirectories.Add

从父目录开始,我希望递归地遍历每个目录,并将目录名添加到列表中(如果它包含任何具有特定结尾的文件)

我的第一个方法是

var allTestDirectories = new List<DirectoryInfo>();

Directory.GetFiles(parentDirectory, "*spec.js", SearchOption.AllDirectories)
         .ForEach(specFile => allTestDirectories.Add(Directory.GetParent(specFile)));

var distinctTestDirectories = allTestDirectories.Distinct().ToList();
var allTestDirectories=new List();
Directory.GetFiles(parentDirectory,“*spec.js”,SearchOption.AllDirectories)
.ForEach(specFile=>allTestDirectories.Add(Directory.GetParent(specFile)));
var distinctTestDirectories=allTestDirectories.Distinct().ToList();
这不是很好,因为各种原因,其中一个最明显的原因是它以所需的结尾遍历所有文件,而只检测其中一个文件就足够了

我假设,使用LINQ的
Any
函数,在仍然是声明性的情况下,应该可以更有效地实现这一点。但是我该怎么做呢

为什么不直接:枚举所有(子)目录,使其至少包含一个具有所需结尾的文件

var distinctTestDirectories = Directory
  .EnumerateDirectories(parentDirectory, "*", SearchOption.AllDirectories)
  .Where(dir => Directory.EnumerateFiles(dir, "*spec.js").Any())
  .ToList();
为什么不直接:枚举所有(子)目录,以便至少包含一个具有所需结尾的文件

var distinctTestDirectories = Directory
  .EnumerateDirectories(parentDirectory, "*", SearchOption.AllDirectories)
  .Where(dir => Directory.EnumerateFiles(dir, "*spec.js").Any())
  .ToList();

您可以将GetParent放入选择框:

var allTestDirectories = new List<DirectoryInfo>();

var distinctTestDirectories = Directory.GetFiles(parentDirectory, "*spec.js", SearchOption.AllDirectories)
    .Select(f => Directory.GetParent(f))
    .ToList();
var allTestDirectories=new List();
var distinctTestDirectories=Directory.GetFiles(parentDirectory,“*spec.js”,SearchOption.AllDirectories)
.Select(f=>Directory.GetParent(f))
.ToList();

您可以将GetParent放入一个选择:

var allTestDirectories = new List<DirectoryInfo>();

var distinctTestDirectories = Directory.GetFiles(parentDirectory, "*spec.js", SearchOption.AllDirectories)
    .Select(f => Directory.GetParent(f))
    .ToList();
var allTestDirectories=new List();
var distinctTestDirectories=Directory.GetFiles(parentDirectory,“*spec.js”,SearchOption.AllDirectories)
.Select(f=>Directory.GetParent(f))
.ToList();

创建您自己的itterative函数。如果您发现自己正在执行
新列表()
则停止并使用LINQ。创建您自己的itterative函数。如果您发现自己正在执行
新列表()
则停止并使用LINQ。