2013-04-08 4 views
20

Ich habe 2 Listenobjekte (vereinfacht):Linq Filterliste <string> wo es einen String-Wert aus einer anderen Liste enthält <string>

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

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

Ich möchte die fileLst filtern, dass nur Dateien zurückzukehren einem Ordnernamen aus der umschließende Filterliste. (Ich hoffe, das macht Sinn ..)

Ich habe den folgenden Ausdruck versucht, aber das gibt immer eine leere Liste zurück.

Ich kann nicht scheinen zu verstehen, warum ich nichts bekomme, klar ich vermisse etwas, aber ich habe keine Ahnung was.

[EDIT]

Ok, so scheint es, ich in meiner Frage klarer sein sollte, ich hatte versucht, für Dateien in meinem filelist mit einem Teil enthält String-Wert von meiner Filterliste zu suchen. Ich habe die Antwort unten für diejenigen markiert, die versuchen, eine ähnliche Sache zu tun.

+1

Warum Sie gebrauchte? var filteredFileList = fileList.Where (fl => filterList.Contains (fl)); –

+0

Ich denke, für Ihren Ausdruck, nehmen Sie eine einzelne Dateiliste als x wird ein char, es sieht aus, wenn filterList enthält das char. (Zeichenfolge wird IEnumerable –

+0

@David Tryon - Ich habe nicht zuvor schneiden, obwohl es laufen Ich erhalte eine leere Liste, wenn ich weiß, dass sie einige Werte enthalten sollte: var filteredFileList = fileList.Intersect (filterList); –

Antwort

40

seine noch einfacher:

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

Ich dachte, es sollte auch so einfach sein, aber aus irgendeinem Grund ist meine gefilterte Liste leer, wenn ich weiß, dass sie einige String-Werte enthalten sollte, könnte ich irgendwo anders etwas verpassen? –

+0

stellen Sie sicher, dass die Verzeichnisnamen wirklich gleich sind -> "c: \ test" ist nicht gleich "c: \ TEST \" – fixagon

+0

Vergessen Sie nicht, dort nach Nullen zu suchen. –

5

Versuchen Sie folgendes:

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

falls Sie nicht für eine exakte Übereinstimmung filtern wollen, aber für eine „enthält“ Sie können diesen Ausdruck verwenden

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

Wenn Sie iterieren filteredFileSet (siehe LINQ Execution) wird es aus einer Reihe von IEnumberable-Werten bestehen. Dies basiert auf der Überprüfung des Where-Operators, um sicherzustellen, dass Elemente innerhalb des filelist-Datensatzes in der Filterliste festgelegt sind.

Als filelist ein IEnumerable set of string values ist, können Sie die ‚Artikel‘ Wert übergeben direkt in das Verfahren enthält.

1

können Sie tun, dass

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