2017-03-22 2 views
2

J'essaie d'interroger un dossier et de retourner uniquement les dossiers avec un nom de dossier numérique. Le hic, c'est que j'en ai besoin dans un objet DirectoryInfo[].Comment retourner un objet DirectoryInfo constitué de noms de dossiers numériques?

que je pouvais faire comme ça (et ça marche):

List<string> subDirList = Directory.GetDirectories(rootPath, "*", SearchOption.TopDirectoryOnly) 
          .Where(f => Regex.IsMatch(f, @"[\\/]\d+$")).ToList();

Mais je vraiment besoin de quelque chose comme ceci:

DirectoryInfo[] subDirs = Directory.GetDirectories(rootPath, "*", SearchOption.TopDirectoryOnly) 
            .Where(f => Regex.IsMatch(f, @"[\\/]\d+$")); 

Toutes les suggestions?

Répondre

5

Vous pouvez utiliser un .Select(..) pour la carte à DirectoryInfo puis utilisez ToArray():

DirectoryInfo[] subDirs = Directory.GetDirectories(rootPath, "*", SearchOption.TopDirectoryOnly) 
            .Where(f => Regex.IsMatch(f, @"[\\/]\d+$")) 
            .Select(x => new DirectoryInfo(x)) //convert it to a DirectoryInfo 
            .ToArray(); // make the result an Array
+1

J'aime ce site ... Merci !!! Travaillé parfaitement. – pwquigle

2

instancier un objet de type DirectoryInfo et ensuite faire votre requête. La méthode DirectoryInfo.GetDirectories retourne le tableau désiré de type DirectoryInfo

DirectoryInfo dirInfo = new DirectoryInfo(yourpath); 

DirectoryInfo[] subDirs = dirInfo.GetDirectories("*", SearchOption.TopDirectoryOnly) 
         .Where(f => Regex.IsMatch(f.FullName, @"[\\/]\d+$")).ToArray(); 

EDIT:

En C# 7, vous pouvez éviter d'utiliser regex avec un int.TryParse simple:

DirectoryInfo[] subDirs = dirInfo.GetDirectories("*", SearchOption.TopDirectoryOnly) 
         .Where(f => int.TryParse(f.Name, out _)).ToArray(); 

ci-dessous C# 7 vous aurait besoin d'une variable supplémentaire de type int pour la valeur out

+0

Directory.GetDirectories ne prend pas de chemin, déplace 'rootPath' jusqu'au constructeur de' DirectoryInfo' et le supprime de l'appel 'GetDirectories'. –

+0

@ LasseV.Karlsen merci pour l'indice, je devais copier rapidement coller. :) inclus les liens nécessaires –

+0

Mais 'Where' filtre et renvoie un' IEnumerable <> '... –