Linq过滤器List <string>,其中包含来自另一个List <string> </string> </string>的字符串值

时间:2013-04-08 13:01:39

标签: c# .net linq list filtering

我有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的字符串值的子字符串中的文件。对于那些试图做类似事情的人,我已在下面给出了答案。

3 个答案:

答案 0 :(得分:49)

它更容易:

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

如果您想要过滤不是完全匹配,但是对于“包含”,您可以使用此表达式:

var t = fileList.Where(file => filterList.Any(folder => file.ToUpperInvariant().Contains(folder.ToUpperInvariant())));

答案 1 :(得分:7)

尝试以下方法:

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

当你遍历 filteredFileSet (参见LINQ Execution)时,它将包含一组IEnumberable值。这是基于Where运算符检查以确保 fileList 数据集中的项目包含在 filterList 集合中。

由于 fileList IEnumerable set of string values,您可以将“”值直接传递给Contains方法。

答案 2 :(得分:1)

你可以那样做

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