2013-04-08 76 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())); 
相關問題