2013-04-08 102 views
20

我有2个List对象(简体):LINQ的过滤列表<string>它包含从另一个列表中的字符串值<string>

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

+1

为什么你使用任何? var filteredFileList = fileList.Where(fl => filterList.Contains(fl)); – 2013-04-08 13:06:15

+0

我认为,对于你的表达,你采取单一的文件列表比x会是一个字符,它看起来如果filterList包含字符。(字符串变成IEnumerable ) – 2013-04-08 13:13:21

+0

@David Tryon - 我以前没有使用Intersect,虽然运行它,当我知道它应该包含一些值时,我得到一个空列表:var filteredFileList = fileList.Intersect(filterList); – 2013-04-08 13:16:06

回答

40

它更容易:

fileList.Where(item => filterList.Contains(item)) 
你想不过滤精确匹配,但对于

的情况下,“包含”您可以使用此表达式:

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

我认为这应该很容易,但由于某种原因,我的过滤列表是空的,当我知道它应该包含一些字符串值时,我是否可以在其他地方丢失某些东西? – 2013-04-08 13:19:52

+0

确保目录名称真的相等 - >“c:\ test”不等于“c:\ TEST \” – fixagon 2013-04-08 13:23:48

+0

不要忘记检查那里的空值。 – 2015-09-18 05:14:50

5

尝试以下操作:

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

当您迭代filteredFileSet(请参阅LINQ Execution)它将包含一组IEnumberable值。这是基于Where操作员检查以确保fileList数据集中的项目包含在filterList集合中。

作为的fileListIEnumerable set of string values,可以通过“”值直接进入包含方法。

1

你能做到这一点

var filteredFileList = fileList.Where(fl => filterList.Contains(fl.ToString())); 
相关问题