2017-03-22 9 views
2

私はフォルダを照会し、数値のフォルダ名を持つフォルダのみを返そうとしています。キャッチは、私がDirectoryInfo[]オブジェクトで必要とすることです。数字のフォルダ名で構成されるDirectoryInfoオブジェクトを返すにはどうすればよいですか?

私は、それはこのように行うことができます(そして、それは動作します):

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

任意の提案:

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

しかし、私は本当にこのようなものが必要?

答えて

5

あなたはDirectoryInfoにマッピングして、ToArray()を使用するように.Select(..)を使用することができます。

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

私はこのサイトが大好きです...ありがとうございました!!!完璧に働いた。 – pwquigle

2

はタイプDirectoryInfoのオブジェクトをインスタンス化して、クエリを作ります。この方法DirectoryInfo.GetDirectoriesは、タイプの所望の配列を返しますDirectoryInfo

DirectoryInfo dirInfo = new DirectoryInfo(yourpath); 

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

EDIT:C#7で

あなたが簡単なint.TryParseで正規表現を使用して避けることができ:C#7以下

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

ますout値の場合はintの追加変数が必要です。

+0

Directory.GetDirectoriesはパスを取らず、 'rootPath'を' DirectoryInfo'のコンストラクタまで移動し、 'GetDirectories'の呼び出しからそれを削除します。 –

+0

@ LasseV.Karlsenのヒントのために、私は貼り付けを素早くコピーしました。 :)必要なリンクが含まれています –

+0

しかし 'Where'は' IEnumerable <> 'をフィルタリングして返します... –

関連する問題