c# 查找目录中包含 list/array/datatable 等中指定值的所有文件名

c# find all filenames in directory that contain a value specified in list/array/datatable etc

使用 c# .NET 4.6.1 我有一组字符串要用于 select 来自给定目录的“有效”文件。这就是我的意思:

这是我想用来从存储在数组中的目录中获取预期文件名的字符串示例。我不在乎这些值是存储在数组、列表还是其他类型的集合中。我可以将它们放入最适合搜索我想要的文件名的任何类型的集合中。

//"ValidValues" doesn't have to be an array, 
//it can be a list/array/datatable or some other kind of collection
string[] ValidValues = new string[2] {"ab","cd"};

目录中的文件:

file_1_.txt

file_ab_.blah

file_2_.something

file_cd_.blo

等等

我想使用包含我想用作搜索条件的字符串的 ValidValues 集合在目录中搜索文件名。我过去使用这个从目录中获取文件名:

string[] ValidFiles = Directory.GetFiles(@"C:\Drop");

但我不知道如何指定一个过滤器,该过滤器使用要在目录中的文件名中搜索的集合中包含的值。我知道有一些 lambda 表达式可以做到这一点,但我不太确定如何使用它们。在我要查找的代码是 运行 之后,我希望有

file_ab_.blah

file_cd_.blo

ValidFiles.

我看到一些帖子的搜索条件是硬编码的,并用“||”分隔或其他搜索字符串集合循环的地方,但我想通过使用 ValidValues 来使它动态化,以在我的目录中查找包含 ValidValues 中任何值的文件名。我正在从数据库中获取 ValidValues 中包含的字符串。

希望这是有道理的,我有一种强烈的感觉,它可以完成我只是不知道完成它的确切语法。我不关心它是如何完成的,使用 LINQ 或其他任何东西,我只想要最优雅和最有效的方法。如果可能的话,我想避免循环遍历从数据库中获取的字符串集合,而是使用从数据库中获取的字符串集合作为单个语句中的搜索条件,可能使用类似 lambda 表达式之类的东西之类的。提前致谢。

考虑到您的过滤器关键字已经在集合中,您可以执行以下操作。

var filteredFileList = ValidStrings.SelectMany(filter => Directory.EnumerateFiles(filePath, $"*{filter}*"))
    .ToList();

其中 ValidStrings 是您的过滤器关键字的集合,filePath 是您要搜索的位置