web-dev-qa-db-ja.com

特定の拡張子のDirectory.GetFiles

このlinq式を簡素化する方法はありますか、またはこれを行うより良い方法はありますか?

Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
         .Where(s => s.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) ||
                     s.EndsWith(".gif", StringComparison.OrdinalIgnoreCase) ||
                     s.EndsWith(".png", StringComparison.OrdinalIgnoreCase) ||
                     ...);

基本的に、特定の拡張子のすべてのファイルを返したいです。残念ながら、この方法はあまり柔軟ではありません。私はむしろリストに拡張子を追加し、Directory.GetFilesがそれらの拡張子を返すようにしたいです。それは可能ですか?

47
XSL

LINQでフィルタリングを行う場合、次のように行うことができます。

var ext = new List<string> {".jpg", ".gif", ".png"};
var myFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
     .Where(s => ext.Contains(Path.GetExtension(s)));

extには許可される拡張子のリストが含まれるようになりました。柔軟なフィルタリングの必要に応じて、アイテムを追加または削除できます。

94
dasblinkenlight

Directory.GetFiles(String, String) オーバーロードは既にそれをしていませんか?ただDirectory.GetFiles(dir, "*.jpg", SearchOption.AllDirectories)するだけです

それらをリストに入れたい場合は、"*.jpg"リストを反復処理し、結果を全体の結果セットに集約する変数を使用します。それらを個別に指定するよりもはるかに明確です。 =)

何かのようなもの...

foreach(String fileExtension in extensionList){
    foreach(String file in Directory.GetFiles(dir, fileExtension, SearchOption.AllDirectories)){
        allFiles.Add(file);
    }
}

(ディレクトリが大きい場合、EnumerateFilesの代わりに GetFiles を使用するとより効率的になる可能性があります)

14
Tyler Lee

私は次のような単一の行を使用してやったでしょう

List<string> imageFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
      .Where(file => new string[] { ".jpg", ".gif", ".png" }
      .Contains(Path.GetExtension(file)))
      .ToList();
5
RkHirpara