66

この 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 でそれらの拡張機能を返せるようにしたいと考えています。それは可能ですか?

4

3 に答える 3

115

LINQ でフィルタリングを行いたい場合は、次のようにできます。

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

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

于 2012-11-09T02:05:47.583 に答える
23

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方が効率的である可能性があります)

于 2012-11-09T02:04:48.450 に答える