web-dev-qa-db-fra.com

Filtre Linq List <string> où il contient une valeur de chaîne d'une autre List <string>

J'ai 2 objets List (simplifiés):

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

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

Je souhaite filtrer le fileLst pour renvoyer uniquement les fichiers contenant l'un des noms de dossier de la filterList. (J'espère que cela à du sens..)

J'ai essayé l'expression suivante, mais cela renvoie toujours une liste vide.

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

Je n'arrive pas à comprendre pourquoi je ne reçois rien, clairement je manque quelque chose, mais je n'ai aucune idée de quoi.

[MODIFIER]

Ok, il semble donc que j'aurais dû être plus clair dans ma question, j'essayais de rechercher des fichiers dans ma fileList avec une sous-chaîne contenant des valeurs de chaîne de ma filterList. J'ai marqué la réponse ci-dessous pour ceux qui essaient de faire une chose similaire.

26
Mark Johnson

c'est encore plus facile:

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

dans le cas où vous souhaitez filtrer non pas pour une correspondance exacte mais pour un "contient", vous pouvez utiliser cette expression:

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

Essayez ce qui suit:

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

Lorsque vous itérez sur filterFileSet (Voir Exécution LINQ ), il consistera en un ensemble de valeurs IEnumberable. Ceci est basé sur la vérification de l'opérateur Where pour s'assurer que les éléments de l'ensemble de données fileList sont contenus dans l'ensemble filterList.

Comme fileList est un IEnumerable set of string values , vous pouvez passer la valeur ' item' directement dans la méthode Contains.

8
Jamie Keeling

vous pouvez le faire

var filteredFileList = fileList.Where(fl => filterList.Contains(fl.ToString()));
1
Akrem