35

我有 2 个 List 对象(简化):

var fileList = Directory.EnumerateFiles(baseSourceFolderStr, fileNameStartStr + "*", SearchOption.AllDirectories);

var filterList = new List<string>();
filterList.Add("ThisFolderName");
filterList.Add("ThatFolderName");

我想过滤 fileLst 以仅返回包含来自 filterList 的任何文件夹名称的文件。(我希望这是有道理的..)

我尝试了以下表达式,但这总是返回一个空列表。

var filteredFileList = fileList.Where(fl => fl.Any(x => filterList.Contains(x.ToString())));

我似乎无法理解为什么我什么也没得到,显然我错过了一些东西,但我不知道是什么。

[编辑]

好的,所以看起来我的问题应该更清楚,我试图在我的 fileList 中搜索文件,其中包含来自我的 filterList 的字符串值的子字符串。对于那些试图做类似事情的人,我已经在下面标记了答案。

4

3 回答 3

66

它更容易:

fileList.Where(item => filterList.Contains(item))

如果您想要过滤的不是精确匹配而是“包含”,您可以使用以下表达式:

var t = fileList.Where(file => filterList.Any(folder => file.ToUpperInvariant().Contains(folder.ToUpperInvariant())));
于 2013-04-08T13:05:03.130 回答
9

尝试以下操作:

var filteredFileSet = fileList.Where(item => filterList.Contains(item));

当您迭代filteredFileSet(参见LINQ Execution)时,它将由一组IEnumberable 值组成。这基于 Where Operator 检查以确保fileList数据集中的项目包含在filterList集中。

由于fileList是一组 IEnumerable 字符串值,您可以将“ item ”值直接传递给 Contains 方法。

于 2013-04-08T13:10:26.943 回答
1

你可以这样做

var filteredFileList = fileList.Where(fl => filterList.Contains(fl.ToString()));
于 2013-04-08T13:11:33.167 回答