2013-04-08 16 views
20

mam 2 obiekty List (uproszczony):LINQ Lista filtr <string> gdy zawiera ciąg znaków z innej listy <string>

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

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

Chcę filtrować fileLst wrócić tylko pliki zawierające dowolne nazwy folderu z filterList. (Mam nadzieję, że ma to sens).

Próbowałem następujące wyrażenie, ale zawsze zwraca pustą listę.

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

Nie mogę zrozumieć, dlaczego nic nie dostaję, wyraźnie czegoś brakuje, ale nie mam pojęcia co.

[EDIT]

Ok, więc wydaje się, że powinny być jaśniejsze w moje pytanie, starałem się wyszukać pliki w moim FileList z fragmentu zawierającego wartości ciągów z mojego filterList. Poniżej zaznaczam odpowiedź dla tych, którzy próbują zrobić coś podobnego.

+1

Dlaczego użyłeś jakieś? var filtersFileList = fileList.Where (fl => filterList.Contains (fl)); –

+0

Myślę, że dla twojej ekspresji, bierzesz pojedynczą listę plików niż x będzie char, to wygląda, jeśli filterList zawiera znak. (Ciąg staje się IZliczalnym ) –

+0

@ David Tryon - Nie użyłem Intersect wcześniej, chociaż uruchomiłem to , Otrzymuję pustą listę, gdy wiem, że powinna zawierać pewne wartości: var filteredFileList = fileList.Intersect (filterList); –

Odpowiedz

40

jej jeszcze łatwiej:

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

w przypadku, gdy chcesz, aby nie filtrować na dokładne dopasowanie ale na „zawiera” można użyć tego wyrażenia:

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

Myślałem, że to powinno być takie proste, ale z jakiegoś powodu moja przefiltrowana lista jest pusta, kiedy wiem, że * powinna * zawierać pewne wartości ciągów, czy mógłbym czegoś przegapić gdzie indziej? –

+0

upewnij się, że nazwy katalogów są naprawdę równe -> "c: \ test" nie jest równe "c: \ TEST \" – fixagon

+0

Nie zapomnij sprawdzić tam wartości zerowych. –

5

Spróbuj wykonać następujące czynności:

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

Kiedy iteracyjnego filteredFileSet (Patrz LINQ Execution) będzie składał się z zestawu wartości Nienumerowanych. Jest to oparte na sprawdzeniu, gdzie operator sprawdza, czy elementy z zestawu danych znajdują się w zestawie filterList.

Jak fileList jest IEnumerable set of string values można przekazać wartość „poz” bezpośrednio do Zawiera metody.

1

można zrobić

var filteredFileList = fileList.Where(fl => filterList.Contains(fl.ToString())); 
Powiązane problemy