从另一个List<string>中获取包含字符串值的Linq筛选List<string>

39

我有两个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())));

我似乎无法理解为什么我一无所获,显然我漏了些什么,但我不知道是什么。

[编辑]

好的,看起来我在问题上应该更清晰些,我正在尝试使用子字符串从我的filterList中包含字符串值来搜索我的fileList中的文件。我已经在下面标记了答案,供那些试图做类似事情的人参考。


1
为什么要使用 any?变量 filteredFileList = fileList.Where(fl => filterList.Contains(fl)); - Davut Gürbüz
我认为,对于你的表达式,你需要一个单一的文件列表,那么x将会是一个字符,看起来filterList是否包含该字符。(字符串变成IEnumerable<char>) - Davut Gürbüz
@David Tryon - 我以前没有使用过Intersect,但是运行它时,我得到了一个空列表,而我知道它应该包含一些值:var filteredFileList = fileList.Intersect(filterList); - Mark Johnson
@DavutGürbüz - 同样地,对于您的简化查询(我使用.Any是因为我已经尝试了许多不同的示例..),我返回了零结果。我知道我的fileList中有包含在filterList中的字符串。我承认有点困惑.. - Mark Johnson
fileList.Intersect(filteredFileList) 就像 @DavinTryon 所说的那样是一种快捷方式。 - Davut Gürbüz
4个回答

72
更简单的方法是:
fileList.Where(item => filterList.Contains(item))

如果您想进行“包含”而不是精确匹配的筛选,可以使用以下表达式:

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

我也以为这样很简单,但出于某种原因,我的筛选列表为空,尽管我知道它应该包含一些字符串值,难道我在其他地方漏掉了什么吗? - Mark Johnson
请确保目录名称完全相同 --> "c:\test" 不等于 "c:\TEST" - fixagon
不要忘记在其中检查空值。 - CAD bloke
确保在你想知道为什么智能感知不起作用之前,先加入 'using System.Linq'。这是我今天遇到的问题! - kltft
我想用类似SQL语法的方式来实现相同的功能。有人能帮我吗? - Shantilal Suthar

10

请尝试以下方法:

var filteredFileSet = fileList.Where(item => filterList.Contains(item));
当您迭代< strong>filteredFileSet (请参阅 LINQ Execution ),它将由一组IEnumberable值组成。这是基于Where运算符检查fileList 数据集中的项目是否包含在filterList 集合中。

由于fileList 是一组字符串值的 IEnumerable集合,因此可以直接将' item'值传递给Contains方法。


1
你可以这样做。
var filteredFileList = fileList.Where(fl => filterList.Contains(fl.ToString()));

0

选择 * 从员工 其中城市ID在(选择城市ID从城市中,其中国家ID = 1)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接