この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がそれらの拡張子を返すようにしたいです。それは可能ですか?
LINQでフィルタリングを行う場合、次のように行うことができます。
var ext = new List<string> {".jpg", ".gif", ".png"};
var myFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
.Where(s => ext.Contains(Path.GetExtension(s)));
ext
には許可される拡張子のリストが含まれるようになりました。柔軟なフィルタリングの必要に応じて、アイテムを追加または削除できます。
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
を使用するとより効率的になる可能性があります)
私は次のような単一の行を使用してやったでしょう
List<string> imageFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
.Where(file => new string[] { ".jpg", ".gif", ".png" }
.Contains(Path.GetExtension(file)))
.ToList();